Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 11, 2010 19:12:27

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по многопоточности

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')



Офлайн

#2 Ноя. 11, 2010 19:23:03

Carzil
От:
Зарегистрирован: 2010-05-26
Сообщения: 106
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по многопоточности

А не проще сделать так:

#!/usr/bin/python
while (threading.active_count() - 2) > 0:
#всё проверено!



Отредактировано (Ноя. 11, 2010 19:23:49)

Офлайн

#3 Ноя. 11, 2010 19:31:03

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

вопрос по многопоточности

Игнат, не делайте так. У объекта Thread есть метод .join - используйте его.
К слову, в питоне всегда есть только главный поток. Откуда вы взяли второй - для меня загадка.
Среда исполнения его не создает.
Вероятно, спутали с Java или .Net - там garbage collector по другому сделан.



Отредактировано (Ноя. 11, 2010 19:34:22)

Офлайн

#4 Ноя. 11, 2010 20:45:50

Игнат
От:
Зарегистрирован: 2010-10-02
Сообщения: 224
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по многопоточности

Андрей, спасибо

написал в конце вот так:

threading.Thread.join(new_thread)



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version