我想知道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())
如果在语言核心中有一个更精细的策略就太好了。考虑过这个问题吗?
你可以使用eventlet。它允许您编写看似同步的代码,但却可以在网络上异步操作。
下面是一个超级小爬虫的例子:
urls = ["http://www.google.com/intl/en_ALL/images/logo.gif",
"https://wiki.secondlife.com/w/images/secondlife.jpg",
"http://us.i1.yimg.com/us.yimg.com/i/ww/beta/y3.gif"]
import eventlet
from eventlet.green import urllib2
def fetch(url):
return urllib2.urlopen(url).read()
pool = eventlet.GreenPool()
for body in pool.imap(fetch, urls):
print "got body", len(body)
2021年的原生Python异步调用方式,Python 3.9也适用于Jupyter / Ipython内核
Camabeh的答案是从Python 3.3开始的。
异步def display_date(循环):
End_time = loop.time() + 5.0
而真正的:
print (datetime.datetime.now ())
If (loop.time() + 1.0) >= end_time:
打破
等待asyncio.sleep (1)
Loop = asyncio.get_event_loop()
#阻塞调用,当display_date()协程完成时返回
loop.run_until_complete (display_date(循环)
loop.close ()
这将在Jupyter笔记本/ Jupyter实验室工作,但抛出一个错误:
RuntimeError: This event loop is already running
由于Ipython使用事件循环,我们需要一些嵌套异步循环,这在Python中还没有实现。幸运的是,有nest_asyncio来处理这个问题。你所需要做的就是:
!pip install nest_asyncio # use ! within Jupyter Notebook, else pip install in shell
import nest_asyncio
nest_asyncio.apply()
(基于此线程)
只有在调用loop.close()时,它才会抛出另一个错误,因为它可能指向Ipython的主循环。
RuntimeError: Cannot close a running event loop
一旦有人回答了这个github问题,我就会更新这个答案。