Форум сайта python.su
приветствую вас люди добрые
Проблема у меня восникла, не по зубам оказалась.
В общем ограничиваю число потоков вроде вполне логичным способом, только вот не получается нифига, примерно после создания примерно 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()
Офлайн
Thread.start - он не атомарный, и с threading.activeCount не синхронизирован.
И вообще так писать - это же ужас-ужас. Специально для вашей задачи несколько десятков лет назад человечество придумало вещь под названием ThreadPool. И даже успело реализовать пару дюжин раз на Питоне. Воспользуйтесь им.
Google: python threadpool
И выбрать либо первый попавшийся, либо наиболее понравившийся.
Офлайн
threadpool - слишком громоздкий.
я просто не могу понять, почему данный код не работает???
ведь количество активных потоков контролируется!
Офлайн
я в таком случае использую threading.Semaphore
Офлайн
ritiumесли как описали выше - что нету синхронизации, то возможно РЕАЛЬНО успевает стартануть больше 50 потоков - прежде чем метод .activeCount() узнает об этом, и очень скоро РЕАЛЬНОЕ кол-во потоков упирается в ограничение ОС - в линуксе это чаще всего 1024 процесса, в виндовсе не знаю.
приветствую вас люди добрые
Проблема у меня восникла, не по зубам оказалась.
В общем ограничиваю число потоков вроде вполне логичным способом, только вот не получается нифига, примерно после создания примерно 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()
Офлайн
хм… а в линуксе всё без проблем, вообще не одной ошибки
Офлайн
посмотрите логи на виндовсе - Event Vieiwer - если это зарезает ОС, то там будут сообщения.
Офлайн
питон без тюнинга не даёт одновременно создать > ~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 уже берёт задание из очереди в цикле и выполняет что надо, вот и всё
Офлайн