Уведомления

Группа в Telegram: @pythonsu

#1 Авг. 9, 2009 13:58:13

ritium
От:
Зарегистрирован: 2009-08-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

приветствую вас люди добрые
Проблема у меня восникла, не по зубам оказалась.
В общем ограничиваю число потоков вроде вполне логичным способом, только вот не получается нифига, примерно после создания примерно 20000 потоков, выбегает ошибочка типа
Traceback (most recent call last):
File “C:\pp\portcheker\pc.py”, line 20, in <module>
threading.Thread(target=portchk, name=“t1”, args=).start()
File “C:\Python25\lib\threading.py”, line 434, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

вот кусок кода

for i in range(1,100000):
while threading.activeCount()>=50:
pass
threading.Thread(target=portchk, name="t1", args=[host,i]).start()
и вот в каком месте я дурак? :-)



Офлайн

#2 Авг. 9, 2009 16:23:27

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

ограничение многопоточности

Thread.start - он не атомарный, и с threading.activeCount не синхронизирован.
И вообще так писать - это же ужас-ужас. Специально для вашей задачи несколько десятков лет назад человечество придумало вещь под названием ThreadPool. И даже успело реализовать пару дюжин раз на Питоне. Воспользуйтесь им.
Google: python threadpool
И выбрать либо первый попавшийся, либо наиболее понравившийся.



Офлайн

#3 Авг. 18, 2009 09:49:10

ritium
От:
Зарегистрирован: 2009-08-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

threadpool - слишком громоздкий.
я просто не могу понять, почему данный код не работает???
ведь количество активных потоков контролируется!



Офлайн

#4 Авг. 18, 2009 10:42:34

goblin_maks
От:
Зарегистрирован: 2008-12-10
Сообщения: 110
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

я в таком случае использую threading.Semaphore



Офлайн

#5 Авг. 18, 2009 10:51:09

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

ritium
приветствую вас люди добрые
Проблема у меня восникла, не по зубам оказалась.
В общем ограничиваю число потоков вроде вполне логичным способом, только вот не получается нифига, примерно после создания примерно 20000 потоков, выбегает ошибочка типа
Traceback (most recent call last):
File “C:\pp\portcheker\pc.py”, line 20, in <module>
threading.Thread(target=portchk, name=“t1”, args=).start()
File “C:\Python25\lib\threading.py”, line 434, in start
_start_new_thread(self.__bootstrap, ())
thread.error: can't start new thread

вот кусок кода
for i in range(1,100000):
while threading.activeCount()>=50:
pass
threading.Thread(target=portchk, name="t1", args=[host,i]).start()
и вот в каком месте я дурак? :-)
если как описали выше - что нету синхронизации, то возможно РЕАЛЬНО успевает стартануть больше 50 потоков - прежде чем метод .activeCount() узнает об этом, и очень скоро РЕАЛЬНОЕ кол-во потоков упирается в ограничение ОС - в линуксе это чаще всего 1024 процесса, в виндовсе не знаю.



Офлайн

#6 Авг. 18, 2009 11:54:06

ritium
От:
Зарегистрирован: 2009-08-09
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

хм… а в линуксе всё без проблем, вообще не одной ошибки



Офлайн

#7 Авг. 18, 2009 13:52:05

test157
От:
Зарегистрирован: 2009-02-25
Сообщения: 54
Репутация: +  0  -
Профиль   Отправить e-mail  

ограничение многопоточности

посмотрите логи на виндовсе - Event Vieiwer - если это зарезает ОС, то там будут сообщения.



Офлайн

#8 Авг. 18, 2009 22:26:31

slav0nic
Команда
От: dp.ua
Зарегистрирован: 2006-05-07
Сообщения: 2260
Репутация: +  41  -
Профиль   Отправить e-mail  

ограничение многопоточности

питон без тюнинга не даёт одновременно создать > ~300 тредов, изменяется через thread stack size.
Но как уже сказал Светлов, юзай пулы и не страдай фигнёй, не пойму где ты видишь громоздкость.
http://www.ubookcase.com/book/Oreilly/Python.Cookbook.2nd.edition/0596007973/pythoncook2-chp-9-sect-4.html вот например, выкинь лишнее и пойми как оно работает. Простыми словами - стартует программа, создаётся очередь (queue) куда добавляются задания(параметры для worker), запускается N тредов (а не мульон) которые запускают worker, а сей worker уже берёт задание из очереди в цикле и выполняет что надо, вот и всё

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version