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