gpt4 book ai didi

python - 第一次体验 asyncio

转载 作者:行者123 更新时间:2023-12-01 04:15:20 24 4
gpt4 key购买 nike

我正在学习python-asyncio,并且我正在尝试编写一个简单的模型。

我有一个处理任务的函数。在处理时,它会转到另一个远程服务获取数据,然后打印一条消息。

我的代码:

dd = 0

@asyncio.coroutine
def slow_operation():
global dd
dd += 1
print('Future is started!', dd)
yield from asyncio.sleep(10 - dd) # request to another server
print('Future is done!', dd)

def add():
while True:
time.sleep(1)
asyncio.ensure_future(slow_operation(), loop=loop)

loop = asyncio.get_event_loop()
future = asyncio.Future()
asyncio.ensure_future(slow_operation(), loop=loop)
th.Thread(target=add).start()
loop.run_forever()

但是这段代码在 sleep 时不会切换上下文:

yield from asyncio.sleep(10 - dd)

我该如何解决这个问题?

最佳答案

asyncio.ensure_future不是线程安全的,这就是为什么 slow_operation 任务没有在应该启动时启动的原因。使用loop.call_soon_threadsafe :

    callback = lambda: asyncio.ensure_future(slow_operation(), loop=loop)
loop.call_soon_threadsafe(cb)

或者asyncio.run_coroutine_threadsafe如果您运行的是 python 3.5.1:

    asyncio.run_coroutine_threadsafe(slow_operation(), loop)

但是,您应该尽量减少线程的使用。除非您使用在自己的线程中运行任务的库,否则所有代码都应在事件循环内部运行(或在执行程序内部,请参阅 loop.run_in_executor )。

关于python - 第一次体验 asyncio,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34385542/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com