Tôi có ứng dụng đa luồng python. Tôi muốn chạy một vòng lặp asyncio trong một thread và post calbacks và coroutines cho nó từ một thread khác. Nên dễ dàng nhưng tôi không thể có được đầu của tôi xung quanh các công cụ asyncio.python asyncio, cách tạo và hủy tác vụ từ một chủ đề khác
tôi đã đưa ra các giải pháp sau đây mà không một nửa những gì tôi muốn, cảm thấy tự do bình luận về bất cứ điều gì:
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()
Vì vậy, bắt đầu và stoping vòng lặp hoạt động tốt. Tôi đã nghĩ về việc tạo nhiệm vụ bằng cách sử dụng create_task, nhưng phương thức đó không phải là luồng an toàn nên tôi đã bọc nó trong call_soon_threadsafe. Nhưng tôi muốn có thể nhận được đối tượng nhiệm vụ để có thể hủy nhiệm vụ. Tôi có thể làm một công cụ phức tạp bằng cách sử dụng Tương lai và Điều kiện, nhưng phải có một cách đơn giản hơn, không phải vậy?
Cảm ơn ví dụ đã giúp tôi khắc phục một số vấn đề tôi gặp phải. Btw Tôi cũng đã để instanciate tương lai với tương lai (loop = self.loop), nếu không trong một số trường hợp trong tương lai sẽ có vòng lặp sai –
@OlivierRD Bạn nên sử dụng 'concurrent.futures.Future', không phải là 'asyncio.Future'. 'concurrent.futures.Future' không dùng từ khóa' loop'. – dano
tài liệu dường như có nghĩa là: https://docs.python.org/3/library/asyncio-task.html#asyncio.Future –