【发布时间】:2014-02-03 09:58:48
【问题描述】:
我的目标:
- 使用请求浏览网站列表以检查它们。这是在
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.kddecorators.netfirms.com、http://www.railcar.netfirms.com。
我不知道这些网站有什么不同,但我的猜测是它们会不时发送一个字节,因此即使它们不可用,也不会被视为真正的超时。
如果有人有想法,将不胜感激,我已经坚持了几天了。我什至尝试过future 和async,但它们没有引发我需要的异常。
谢谢大家!
【问题讨论】:
标签: python multithreading timeout threadpool