Çok parçalı bir python uygulamasına sahibim. Bir iş parçacığında bir asyncio döngüsünü çalıştırmak ve başka bir iş parçacığından, bu makaleye calbacks ve coroutines göndermek istiyorum. Kolay olmalı ama kafamı asyncio malzemenin etrafında alamıyorum. python asyncio, başka bir iş parçacığının görevleri nasıl oluşturulur ve iptal edilir
İstediğimi yarısı, bir şey üzerinde yorum yapmaktan çekinmeyin yapar aşağıdaki çözüme geldi: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()
Yani başlayan ve döngü stoping çalışıyor. Create_task kullanarak görev oluşturma hakkında düşündüm, ancak bu yöntem threadafe değil, bu yüzden call_soon_threadsafe içine sardım. Ama görevi iptal edebilmek için görev nesnesini alabilmek istiyorum. Gelecek ve Durum'u kullanarak karmaşık bir şeyler yapabilirim, ama daha basit bir yol olmalı, değil mi?
Örnek için verdiğim birçok sorunu düzeltmeme yardımcı oldu. Btw Ayrıca Gelecek ile Gelecek (loop = self.loop) anlamak zorunda kaldı, aksi takdirde bazı durumlarda gelecekte yanlış döngü alırsınız –
@OlivierRD 'concurrent.futures.Future',' asyncio.Future' kullanmalısınız. concurrent.futures.Future' bir 'loop' anahtar kelimesi arugment almaz. – dano
belgelerinin yaptığı gibi görünüyor: https://docs.python.org/3/library/asyncio-task.html#asyncio.Future –