从期货ASYNCIO
问题描述:
我疑惑得到以下与ASYNCIO工作:从期货ASYNCIO
下面的代码片段被查询多个设备(通过SNMP),并返回一个字典,它工作正常,但由multiprocessing.cpu_count()
def do_polling(netelement, snmp_comm):
msg = {}
msg.update({
'bgp' : do_lookup_bgp(netelement, snmp_comm),
'iface' : do_lookup_iface(netelement, snmp_comm),
'ifidx' : do_lookup_ifindex(netelement, snmp_comm),
'agg' : do_lookup_agg(netelement, snmp_comm),
})
return msg
def save(netelement, job):
data[netelement] = job.result()
with concurrent.futures.ProcessPoolExecutor(max_workers=multiprocessing.cpu_count()) as executor:
for k,v in INFO['dev'].items():
job = executor.submit(do_polling, k, v['snmp_comm'])
job.add_done_callback(functools.partial(save, k))
,所以我想通过改变这样的迁移到asyncio
方法:
@asyncio.coroutine
def do_polling(netelement, snmp_comm):
msg = {}
msg['bgp'] = yield from do_lookup_bgp(netelement, snmp_comm)
msg['iface'] = yield from do_lookup_iface(netelement, snmp_comm)
msg['ifidx'] = yield from do_lookup_ifindex(netelement, snmp_comm)
msg['agg'] = yield from do_lookup_agg(netelement, snmp_comm)
@asyncio.coroutine
def schedule(INFO):
for k,v in INFO['dev'].items():
asyncio.async(do_polling(k, v))
asyncio.get_event_loop().run_until_complete(schedule)
但我得到以下埃罗r:
Traceback (most recent call last):
File "/home/app/ip-spotlight/code/ixmac.py", line 60, in <module>
main()
File "/home/app/ip-spotlight/code/ixmac.py", line 16, in main
app.ixmac.initialize.run(INFO)
File "/home/app/ip-spotlight/code/app/ixmac/initialize.py", line 191, in run
asyncio.get_event_loop().run_until_complete(schedule)
File "/usr/lib64/python3.4/asyncio/base_events.py", line 353, in run_until_complete
future = tasks.ensure_future(future, loop=self)
File "/usr/lib64/python3.4/asyncio/tasks.py", line 553, in ensure_future
raise TypeError('A Future, a coroutine or an awaitable is required')
TypeError: A Future, a coroutine or an awaitable is required
你能否告诉我我做错了什么?
答
您并未将其用作协同程序。你应该改变最后一行:
asyncio.get_event_loop().run_until_complete(schedule(the_info_variable))
谢谢:)你介不介意帮我用'edit'以及 – iamsterdam
@iamsterdam你说的'我等待(块)的意思before' –
的'do_polling'函数返回一个保存在'data [netelement]'中的字典。我看到发生了'do_polling'调用'do_lookup_bgp',然后'do_data_wrangling'被调用。我想要发生的事情是:'do_polling'为每个'netelement'调用'do_lookup_bgp','do_lookup_iface','do_lookup_ifindex','do_lookup_agg',然后'do_data_wrangling'来调用 – iamsterdam