同时点击URLS和处理结果

时间:2013-06-24 09:39:27

标签: python multithreading concurrency multiprocessing

我有一个要求,我需要每分钟达到2000个URL并将响应保存到数据库。需要在每分钟开始后的5秒内命中URL(但响应可以等待)。然后,在下一分钟,同样会发生,等等。所以,这对时间至关重要。

我尝试使用Python多处理和线程来解决问题。但是,某些网址可能最多需要30分钟才能响应,从而阻止处理所有其他网址。

我也愿意使用较低级别的东西,比如C,但不知道从哪里开始。

任何正确方向的指导都会有所帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

你需要比线程更轻的东西,因为如果每个URL都可以阻塞很长时间,那么你需要同时发送它们而不是通过线程池。

gevent是一个围绕eventlib循环的Python包装器,它擅长于此类事情。来自他们的文档:

>>> import gevent
>>> from gevent import socket
>>> urls = ['www.google.com', 'www.example.com', 'www.python.org']
>>> jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
>>> gevent.joinall(jobs, timeout=2)
>>> [job.value for job in jobs]
['74.125.79.106', '208.77.188.166', '82.94.164.162']

答案 1 :(得分:0)

我不确定我是否正确理解了问题,但如果你正在使用' n'流程,如果所有' n'他们被困在一个回应,然后改变语言将无法解决您的问题。由于瓶颈是您请求的服务器,而不是您的本地驱动程序代码。您可以通过切换到异步机制来消除此依赖性。不要等待回应!让回调为你处理它!

编辑:您可能想查看https://github.com/kennethreitz/grequests