【发布时间】:2013-04-03 07:23:34
【问题描述】:
我们有一个作业队列,工作人员一次处理一个作业。每个作业都需要我们格式化一些数据并发出 HTTP POST 请求,并将数据作为请求负载。
我们如何让每个工作人员以单线程、非阻塞的方式异步发出这些 HTTP POST 请求?我们不关心请求的响应——我们只想让请求尽快执行,然后让工作人员立即进入下一个工作。
我们已经探索了使用gevent 和grequests 库(请参阅Why does gevent.spawn not execute the parameterized function until a call to 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()
第一个 print 语句执行,但第二个和第三个 print 语句永远不会被打印,并且 url 永远不会被命中。
我们怎样才能让这些异步请求执行?
【问题讨论】:
-
有一个名为 asyncore 的标准库,但对于您的用例而言,它可能太低级了。
-
我必须同意@georgesl 在这一点上的看法,asyncore 将是一个迁移的好地方,因为它将为您的应用程序提供更好的灵活性以供以后开发。此外,
http://stackoverflow.com/questions/15753901/python-asyncore-client-socket-can-not-determaine-connection-status/15754244#15754244这是一个好的开始和如何使用它的示例(请参阅我的问题的答案)。如果没有,您实际上必须在多个进程中执行此操作,如果可以并行发送请求,即使 python 的“子”库也很可能会为您线程化,这就是多进程 -
你的 gevent 代码看起来不错(快速测试告诉我它工作得很好;我使用 gevent 1.0b3)。我想这取决于调用
execute_task的上下文。 -
请问您是否真的需要
gevent?使用非标准库总是有计算风险,因为它们可能依赖于版本,需要在下一个版本中进行更多开发或稍后缺少功能,而标准库不会改变:) 当我阅读您关于版本等的评论时,现在只是一个想法
标签: python asynchronous gevent http-request