Python中的异步方法调用?


177

我想知道Python中是否有任何用于异步方法调用的库。如果您可以做这样的事情会很棒

@async
def longComputation():
    <code>


token = longComputation()
token.registerCallback(callback_function)
# alternative, polling
while not token.finished():
    doSomethingElse()
    if token.finished():
        result = token.result()

或异步调用非异步例程

def longComputation()
    <code>

token = asynccall(longComputation())

在语言核心中拥有更完善的策略,这将是很棒的。是否考虑过?


从Python 3.4开始:docs.python.org/3/library/asyncio.html(3.3的反向端口async以及await3.5的闪亮新语法和语法)。
jonrsharpe

没有回调机制,但是您可以将结果汇总到字典中,并且它基于Python的多处理模块。我确定您可以在装饰后的函数中再添加一个参数作为回调。github.com/alex-sherman/deco
RajaRaviVarma

Answers:


141

您可以使用Python 2.6中添加的多处理模块。您可以使用进程池,然后通过以下方式异步获取结果:

apply_async(func[, args[, kwds[, callback]]])

例如:

from multiprocessing import Pool

def f(x):
    return x*x

if __name__ == '__main__':
    pool = Pool(processes=1)              # Start a worker processes.
    result = pool.apply_async(f, [10], callback) # Evaluate "f(10)" asynchronously calling callback when finished.

这只是一种选择。该模块提供了许多工具来实现您想要的。同样,用这种方法制作装饰器真的很容易。


5
不幸的是,卢卡斯S.,您的示例不起作用。永远不会调用回调函数。
DataGreed

6
值得记住的是,这产生了单独的进程,而不是进程中的单独线程。这可能会产生一些影响。
user47741'2

11
这有效:result = pool.apply_async(f,[10],callback = finish)
MJ

6
为了在python中真正异步地执行任何操作,需要使用multiprocessing模块来生成新进程。仅创建新线程仍然受Global Interpreter Lock的约束,它可以防止python进程一次执行多项操作。
Drahkar 2014年

2
如果您不想在使用此解决方案时生成新进程,请将导入更改为from multiprocessing.dummy import Pool。multiprocessing.dummy具有完全相同的行为,这些行为是通过线程而不是进程实现的
Almog Cohen
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.