Моя цель:Почему ThreadPool не двигается рядом после TimeoutError
- Чтобы пройти через список веб-сайтов, чтобы проверить их с помощью запросов. Это делается в
apply_job
.
Моей проблема:
- Когда
job_pool.next
называется, несколько веб-сайтов по ошибке, и вместо того, чтобы давать ошибку, они просто стоят и даже не даютTimeoutError
. Вот почему я использую тайм-аут в функцииnext
с 10 таймаутом. Этот тайм-аут работает хорошо, но когда возникает исключениеTimeoutError
, функцияnext
в следующий раз продолжает поднимать исключение, даже если следующие веб-сайты хороши. Мне кажется, что он не переходит к следующему элементу и просто петлю над одним и тем же. - Я пробовал с
imap
иimap_unordered
, никакой разницы в этом.
Мой код здесь:
def run_check(websites):
""" Run check on the given websites """
import multiprocessing
from multiprocessing.pool import ThreadPool
pool = ThreadPool(processes=JOB_POOL_SIZE)
try:
job_pool = pool.imap_unordered(apply_job, websites)
try:
while True:
try:
res = job_pool.next(10)
except multiprocessing.TimeoutError:
logging.error("Timeout Error")
res = 'No Res'
csv_callback(res)
except StopIteration:
pass
pool.terminate()
except Exception, e:
logging.error("Run_check Error: %s"%e)
raise
Я использую res = requests.get(url, timeout=10)
для проверки веб-сайтов. Этот тайм-аут не работает для этой проблемы.
Чтобы проверить, вот те сайты, которые создают проблему (не каждый раз, но очень часто): , http://www.railcar.netfirms.com.
Я не могу понять, что отличается от этих сайтов, но я предполагаю, что они продолжают отправлять байты время от времени, поэтому они не считаются реальным таймаутом, хотя они непригодны для использования.
Если у кого-то есть идея, было бы признательно, что я застрял на этом в течение нескольких дней. Я даже попробовал future
и async
, но они не поднимают исключение, которое мне нужно.
Спасибо, ребята!