我有一个要求,我需要每分钟访问多达 2000 个 URL 并将响应保存到数据库。URLS 需要在每分钟开始的 5 秒内被命中(但响应可以等待)。然后,在下一分钟,同样的事情会发生,依此类推。所以,时间紧迫。
我尝试使用 Python 多处理和线程来解决问题。但是,某些 URL 可能需要 30 分钟才能响应,这会阻止处理所有其他 URL。
我也愿意使用较低级别的东西,例如 C,但不知道从哪里开始。
任何正确方向的指导都会有所帮助,谢谢。
我有一个要求,我需要每分钟访问多达 2000 个 URL 并将响应保存到数据库。URLS 需要在每分钟开始的 5 秒内被命中(但响应可以等待)。然后,在下一分钟,同样的事情会发生,依此类推。所以,时间紧迫。
我尝试使用 Python 多处理和线程来解决问题。但是,某些 URL 可能需要 30 分钟才能响应,这会阻止处理所有其他 URL。
我也愿意使用较低级别的东西,例如 C,但不知道从哪里开始。
任何正确方向的指导都会有所帮助,谢谢。
你需要比线程更轻的东西,因为如果每个 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']
我不确定我是否正确理解了这个问题,但是如果您正在使用“n”个进程并且如果所有“n”个进程都卡在响应中,那么更改语言将无法解决您的问题。由于瓶颈是您请求的服务器,而不是您的本地驱动程序代码。您可以通过切换到异步机制来消除这种依赖关系。不要等待回复!让回调为您处理!