2017-08-09 5 views
0

je suis perplexe obtenir ce qui suit pour travailler avec asyncio:contrats à terme à asyncio

l'extrait de code ci-dessous est l'interrogation d'un des dispositifs numériques (via snmp) et retourne un dictionnaire, il fonctionne très bien, mais est limitée par 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)) 

donc je voudrais migrer vers l'approche asyncio en changeant comme celui-ci:

@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) 

mais je reçois la Erro suivante 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 

pouvez-vous s'il vous plaît aviser ce que je fais mal?

Répondre

3

Vous ne l'utilisez pas en tant que coroutine. Vous devez changer la dernière ligne:

asyncio.get_event_loop().run_until_complete(schedule(the_info_variable)) 
+0

merci :) Vous permettez-moi d'aider avec le 'edit' ainsi – iamsterdam

+0

@iamsterdam Que voulez-vous dire par' j'attends (bloc) before' –

+0

la 'do_polling' La fonction renvoie un dict sauvegardé dans 'data [netelement]'. ce que je vois se passe que 'do_polling' appelle' do_lookup_bgp' et après que 'do_data_wrangling' soit appelé. ce que je voudrais arriver est: 'do_polling' pour appeler' do_lookup_bgp', 'do_lookup_iface',' do_lookup_ifindex', 'do_lookup_agg' pour chaque' netelement' et ensuite 'do_data_wrangling' pour être appelé – iamsterdam