我们有一组作业,工作者逐一处理这些作业。每个作业需要我们格式化一些数据并发出一个HTTP POST请求,其中数据是请求有效负载。
如何使每个工作者以单线程、非阻塞的方式异步发出这些HTTP POST请求?我们不关心请求的响应——我们只希望请求尽快执行,然后工作者立即转移到下一个作业。
我们已经尝试使用gevent和grequests库(请参见为什么gevent.spawn不执行参数化函数直到调用Greenlet.join?)。我们的工作者代码看起来像这样:
第一个打印语句被执行,但第二个和第三个打印语句从未被打印,URL也从未被访问。
我们如何使这些异步请求得以执行?
如何使每个工作者以单线程、非阻塞的方式异步发出这些HTTP POST请求?我们不关心请求的响应——我们只希望请求尽快执行,然后工作者立即转移到下一个作业。
我们已经尝试使用gevent和grequests库(请参见为什么gevent.spawn不执行参数化函数直到调用Greenlet.join?)。我们的工作者代码看起来像这样:
def execute_task(worker, job):
print "About to spawn request"
greenlet = gevent.spawn(requests.post, url, params=params)
print "Request spawned, about to call sleep"
gevent.sleep()
print "Greenlet status: ", greenlet.ready()
第一个打印语句被执行,但第二个和第三个打印语句从未被打印,URL也从未被访问。
我们如何使这些异步请求得以执行?
http://stackoverflow.com/questions/15753901/python-asyncore-client-socket-can-not-determaine-connection-status/15754244#15754244
这里有一个很好的起点和示例,展示了如何使用它(请看我的问题的答案)。如果不行的话,你就必须使用多进程来实现,即使是Python的“子”库,如果可以并行发送请求,也很可能会为你进行线程处理,这就是多进程的特点。 - Torxedexecute_task
的上下文环境。 - robertklepgevent
吗?使用非标准库始终存在风险,因为它们可能与版本相关,在后续发布中需要更多开发或缺少功能,而标准库不会改变 :) 当我读到您关于版本等方面的评论时,只是想到了这个。 - Torxed