Python脚本在异步回调之前结束

时间:2014-11-18 02:46:33

标签: python asynchronous

我正在使用一个异步调用服务器方法的库:

def asyncCallback(error, result):
    print error, result

server.call("methodname", [param1, param2], asyncCallback)

唯一的问题是asyncCallback永远不会被调用。我想了一段时间这是我使用的API的一个问题,直到我添加了exiting = raw_input("about to exit")这将挂起程序。然后我会看到asyncCallback打印输出。

任何想法如何处理这种情况?老实说,如果这只是同步的话会很好,例如, error, result = server.call("methodname", [param1, param2])。我想这会有很大的性能缺点,但这只是一个方便的脚本,程序不会做任何其他事情,而是在此期间等待回调。

2 个答案:

答案 0 :(得分:1)

您可以让主执行线程等待回调将明确设置的某个标志。以下是使用threading.Event(和functools.partial允许将任意参数传递给回调函数的示例):

from threading import Event
from functools import partial

def asyncCallback(event, error, result):
    print error, result
    event.set()

event = Event()
func = partial(asyncCallback, event)
server.call("methodname", [param1, param2], func)
event.wait()  # This will block until asyncCallback calls event.set()

答案 1 :(得分:0)

这是我用@ dano的答案作为起点的解决方案。我基本上使用函数装饰器来包装异步函数,使其像同步函数一样。

def syncify(func):
    def wrap(func, *args, **kwargs):
        event = Event()
        results = []

        def async(*args):
            print 'called back'
            print args
            results.append(args)
            event.set()

        print 'calling'
        kwargs['callback'] = async
        func(*args, **kwargs)
        event.wait()

        print 'results'
        return results[0]

    return partial(wrap,func)


print 'wrap it'
print syncify(client.call)('user', ['chet'])

它的工作很棒!

但这种方法有什么缺点吗?我很惊讶,这并没有在其他地方实施......