Форум сайта python.su
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')
Офлайн
А не проще сделать так:
#!/usr/bin/python
while (threading.active_count() - 2) > 0:
#всё проверено!
Отредактировано (Ноя. 11, 2010 19:23:49)
Офлайн
Игнат, не делайте так. У объекта Thread есть метод .join - используйте его.
К слову, в питоне всегда есть только главный поток. Откуда вы взяли второй - для меня загадка.
Среда исполнения его не создает.
Вероятно, спутали с Java или .Net - там garbage collector по другому сделан.
Отредактировано (Ноя. 11, 2010 19:34:22)
Офлайн
Андрей, спасибо
написал в конце вот так:
threading.Thread.join(new_thread)
Офлайн