1

使异步调用显示为同步的最佳方法是什么?例如,类似这样的事情,但我如何协调调用线程和异步回复线程?在 java 中,我可能会使用超时的 CountdownLatch(),但我找不到 Python 的明确解决方案

def getDataFromAsyncSource():
    asyncService.subscribe(callback=functionToCallbackTo)
    # wait for data
    return dataReturned

def functionToCallbackTo(data):
    dataReturned = data
4

2 回答 2

5

有一个你可以使用的模块

import concurrent.futures

查看这篇文章以获取示例代码和模块下载链接: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())))
于 2012-05-25T07:44:45.157 回答
4

一个常见的解决方案是使用同步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内部使用模块的解决方案,因此它可能无法根据您的异步库工作。

于 2012-05-29T05:59:24.933 回答