avonar
@avonar

Threads, python?

Есть код(быдлокод), он призван брать прокси из файла и, если он(прокси) рабочий, то класть его в другой файл. Если речь идет о паре тысячах записей, то скрипт работает, если их много, то оно выдает:
Exception in thread Thread-8068:<br/>
Traceback (most recent call last):<br/>
 File &quot;C:\Python27\lib\threading.py&quot;, line 530, in __bootstrap_inner<br/>
 self.run()<br/>
 File &quot;C:\Python27\lib\threading.py&quot;, line 483, in run<br/>
 self.__target(*self.__args, **self.__kwargs)<br/>
 File &quot;E:\python\proxy\proxy_def.py&quot;, line 17, in run<br/>
 g = Grab()<br/>
 File &quot;build\bdist.win32\egg\grab\grab.py&quot;, line 138, in __init__<br/>
 self.trigger_extensions('init')<br/>
 File &quot;build\bdist.win32\egg\grab\grab.py&quot;, line 353, in trigger_extensions<br/>
 getattr(ext, 'extra_%s' % event)(self)<br/>
 File &quot;build\bdist.win32\egg\grab\ext\pycurl.py&quot;, line 47, in extra_init<br/>
 grab.curl = pycurl.Curl()<br/>
error: initializing curl failed


Сам код здесь. Вообще юзаю это все под виндой, и использую либу grab, которая юзает pycurl(ну это вы и сами видите)
  • Вопрос задан
  • 3167 просмотров
Пригласить эксперта
Ответы на вопрос 2
Yngvie
@Yngvie
Рискну предположить, что проблема кроется в следующем:
curl.haxx.se/libcurl/features.html#thread
Хотя сам libcurl и заточен под многопоточность, он полагается на ряд фунций (например gethostby*) которые могут оказаться не thread-safe.

При большом количестве потоков возрастает шанс возникновения таких коллизий. Если это так, то можно отлавливать такие ошибки с помощью try..except и перезапускать парсер через какое-то время.

Еще неплохо было бы ограничить количество одновременно работающих потоков. У вас есть свой костыль для этого, но в питоне есть библиотека для работы с очередью задач:
docs.python.org/library/queue.html

Внизу есть простой пример.
Ответ написан
Yngvie
@Yngvie
Хм, не знаю особенностей curl под Windows, поэтому точное число сказать не могу.

У Вас количество потоков прыгает между 10 и 90, попробуйте разные значения в этом диапазоне.

Ну и подбирать число потоков чтобы обеспечить работоспособность — это все таки не основное решение.
Добавьте обработчик ошибки который перезапустит задачу с текущим прокси.

Судя по тому, что ошибка возникает в строчке g = Grab() то ошибка возникает случайно, вне зависимости от каких либо параметров, так что зациклится оно не должно. Но на всякий случай можно ограничить количество перезапусков.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы