我正在使用一个异步调用服务器方法的库:
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])
。我想这会有很大的性能缺点,但这只是一个方便的脚本,程序不会做任何其他事情,而是在此期间等待回调。
答案 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'])
它的工作很棒!
但这种方法有什么缺点吗?我很惊讶,这并没有在其他地方实施......