Найти - Пользователи
Полная версия: вопрос по многопоточности
Начало » Python для новичков » вопрос по многопоточности
1
Игнат
python 3.1, чекер портов
запускаем 1000 потоков на проверку первых пятиста портов, выводим на экран номера тех, к которым удалось подключиться.

Собственно, вопрос: почему, если написать while threading.active_count() > 0: – программа не завершается?
Т.е. подразумевается что 2 потока всегда остаются запущенны.
Я где-то читал что как раз 2 потока всегда работают - это главный код и среда исполнения, в которой он выполняется (как-то так, извините за ламоразмы). Но в данном случае используется threading, который вроде как породил 1000 дополнительных потоков, из которых 2 никак не завершаются.

Просветите пожалуйста.

def threadMain():
global queue

while True:
try:
task = queue.get_nowait()
except:
return 0

process(task)

def process(port):

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.01)

try:
sock.connect(('localhost', port))
except:
return 0

print('opened:', port)
sock.close()


# main

queue = queue.Queue()

for i in range(500):
queue.put(i)

for test in range(1000):
new_thread = threading.Thread(target=threadMain)
new_thread.start()

while threading.active_count() > 2:
pass

print('done')
Carzil
А не проще сделать так:
#!/usr/bin/python
while (threading.active_count() - 2) > 0:
#всё проверено!
Андрей Светлов
Игнат, не делайте так. У объекта Thread есть метод .join - используйте его.
К слову, в питоне всегда есть только главный поток. Откуда вы взяли второй - для меня загадка.
Среда исполнения его не создает.
Вероятно, спутали с Java или .Net - там garbage collector по другому сделан.
Игнат
Андрей, спасибо

написал в конце вот так:
threading.Thread.join(new_thread)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB