Python gevent 的异步请求 return 的返回值怎么得到

2018-09-13 11:14:16 +08:00
 kidlfy
import gevent.monkey
gevent.monkey.patch_socket()

import gevent
import urllib2
import simplejson as json

def fetch(pid):
response = urllib2.urlopen('http://json-time.appspot.com/time.json')
result = response.read()
json_result = json.loads(result)
datetime = json_result['datetime']
print 'Process ', pid, datetime
return json_result['datetime']

def asynchronous():
threads = []
for i in range(1,10):
threads.append(gevent.spawn(fetch, i))
gevent.joinall(threads)

我想得到 fetch 里面那个 return 的返回值,在 gevent.spawn 的情况下怎么才能得到 spawn 的函数里 return 的值啊
4491 次点击
所在节点    Python
7 条回复
uwh0am1
2018-09-13 13:09:23 +08:00
kidlfy
2018-09-13 14:00:12 +08:00
或者说,我并不太理解在并发执行函数时怎么能得到每个函数的返回值? 不用 gevent 有别的方法吗
xpresslink
2018-09-13 15:30:16 +08:00
这么简单问题还用问?
import queue

q = queue.Queue(maxsize=0)

把 return 改成

q.put( json_result['datetime'])

用 q.get()一个一个取,或者 list(q.queue) 一起取
kidlfy
2018-09-13 15:47:08 +08:00
@xpresslink 我就是这么取的,只是想知道 return 能不能 直接得到
xpresslink
2018-09-14 11:01:19 +08:00
@kidlfy
你 return 给谁呀?
那样就成了顺序调用无法并发了。
kidlfy
2018-09-14 13:40:38 +08:00
@xpresslink 嗯嗯,我理解一点了,谢谢
fzzff
2018-09-14 18:35:36 +08:00
from gevent import monkey
monkey.patch_socket()
monkey.patch_ssl()
import gevent
import requests
import simplejson as json
from tornado import gen

@gen.coroutine
def fetch(pid):
response = requests.get('https://www.baidu.com')
result = response.text
# json_result = json.loads(result)
# datetime = json_result['datetime']
print('Process ', result)
raise gen.Return(result)
# return result

def asynchronous():
threads = []
for i in range(1,10):
threads.append(gevent.spawn(fetch, i))
gevent.joinall(threads)

可以这样

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/488858

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX