Ho un'applicazione python multi-threaded. Voglio eseguire un ciclo asyncio in un thread e postare calback e coroutine da un altro thread. Dovrebbe essere facile, ma non riesco a capire come funziona il asyncio.python asyncio, come creare e cancellare compiti da un altro thread
sono arrivato fino alla soluzione seguente che fa la metà di quello che voglio, sentitevi liberi di commentare nulla:
import asyncio
from threading import Thread
class B(Thread):
def __init__(self):
Thread.__init__(self)
self.loop = None
def run(self):
self.loop = asyncio.new_event_loop()
asyncio.set_event_loop(self.loop) #why do I need that??
self.loop.run_forever()
def stop(self):
self.loop.call_soon_threadsafe(self.loop.stop)
def add_task(self, coro):
"""this method should return a task object, that I
can cancel, not a handle"""
f = functools.partial(self.loop.create_task, coro)
return self.loop.call_soon_threadsafe(f)
def cancel_task(self, xx):
#no idea
@asyncio.coroutine
def test():
while True:
print("running")
yield from asyncio.sleep(1)
b.start()
time.sleep(1) #need to wait for loop to start
t = b.add_task(test())
time.sleep(10)
#here the program runs fine but how can I cancel the task?
b.stop()
Quindi, a partire e l'arresto del ciclo funziona bene. Ho pensato di creare un compito usando create_task, ma quel metodo non è protetto da thread, quindi l'ho spostato in call_soon_threadsafe. Ma mi piacerebbe essere in grado di ottenere l'oggetto compito per poter annullare l'attività. Potrei fare una roba complicata usando Future e Condition, ma ci deve essere un modo più semplice, no?
Grazie per l'esempio mi ha aiutato a risolvere diversi problemi che avevo. Dovevo anche installare Future with Future (loop = self.loop), altrimenti in alcuni casi il futuro avrebbe preso il ciclo sbagliato –
@OlivierRD Dovresti usare 'concurrent.futures.Future', non' asyncio.Future'. 'concurrent.futures.Future' non accetta un arugment di parola chiave' loop'. – dano
la documentazione sembra dire che lo fa: https://docs.python.org/3/library/asyncio-task.html#asyncio.Future –