使异步调用显示为同步的最佳方法是什么?例如,像这样的东西,但我如何协调调用线程和异步回复线程?在java中我可能会使用带有超时的CountdownLatch(),但我找不到Python的明确解决方案
def getDataFromAsyncSource():
asyncService.subscribe(callback=functionToCallbackTo)
# wait for data
return dataReturned
def functionToCallbackTo(data):
dataReturned = data
答案 0 :(得分:5)
您可以使用模块
import concurrent.futures
查看此帖子,了解示例代码和模块下载链接:Concurrent Tasks Execution in Python
您可以在将来放置执行者结果,然后获取它们,这是http://pypi.python.org的示例代码:
import concurrent.futures
import urllib.request
URLS = ['http://www.foxnews.com/',
'http://www.cnn.com/',
'http://europe.wsj.com/',
'http://www.bbc.co.uk/',
'http://some-made-up-domain.com/']
def load_url(url, timeout):
return urllib.request.urlopen(url, timeout=timeout).read()
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
future_to_url = dict((executor.submit(load_url, url, 60), url)
for url in URLS)
for future in concurrent.futures.as_completed(future_to_url):
url = future_to_url[future]
if future.exception() is not None:
print('%r generated an exception: %s' % (url,future.exception()))
else:
print('%r page is %d bytes' % (url, len(future.result())))
答案 1 :(得分:3)
一个常见的解决方案是使用同步Queue
并将其传递给回调函数。见http://docs.python.org/library/queue.html。
因此,对于您的示例,这可能看起来像(我只是猜测API将其他参数传递给回调函数):
from Queue import Queue
def async_call():
q = Queue()
asyncService.subscribe(callback=callback, args=(q,))
data = q.get()
return data
def callback(data, q):
q.put(data)
这是一个在内部使用threading
模块的解决方案,因此根据您的异步库可能无法正常工作。