我想知道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())
如果在语言核心中使用更加精细的策略,那就太棒了 . 这是考虑过吗?
12 回答
有没有理由不使用线程?您可以使用
threading
类 . 而不是finished()
函数使用isAlive()
.result()
函数可以join()
线程并检索结果 . 并且,如果可以,则覆盖run()
和__init__
函数以调用构造函数中指定的函数,并将值保存到类的实例中 .您可以使用Python 2.6中添加的multiprocessing module . 您可以使用进程池,然后异步获取结果:
例如 . :
这只是一种选择 . 该模块提供了许多设施来实现您的需求 . 从这里制作装饰器也很容易 .
就像是:
有关详细信息,请参阅https://docs.python.org/2/library/threading.html#module-threading的文档;此代码也适用于Python 3 .
从Python 3.5开始,您可以使用增强型生成器来实现异步功能 .
Enhanced generator syntax:
New async/await syntax:
它不是语言核心,而是一个非常成熟的库,可以做你想要的Twisted . 它引入了Deferred对象,您可以将回调或错误处理程序("errbacks")附加到 . 延迟基本上是"promise",函数最终会得到一个结果 .
你可以实现一个装饰器来使你的函数异步,虽然这有点棘手 .
multiprocessing
模块充满了小怪癖和看似随意的限制 - 更有理由将它封装在友好的界面之后 .下面的代码说明了装饰器的用法:
在一个真实的案例中,我会在装饰器上详细说明一下,提供一些方法来关闭它以进行调试(同时保持未来的接口),或者可能是处理异常的工具;但我认为这足以证明这一原则 .
只是
我的解决方案是:
并按照要求完成工作:
你可以使用eventlet . 它允许您编写看似同步代码的内容,但让它在网络上异步操作 .
以下是超级最小爬虫的示例:
这样的东西对我有用,然后你可以调用该函数,它会将自己调度到一个新的线程上 .
您可以使用concurrent.futures(在Python 3.2中添加) .
您可以使用流程 . 如果你想永远运行它,请使用while(如网络)功能:
如果您只想运行一次,请执行以下操作: