下面是我运行的代码段:
from concurrent.futures import ProcessPoolExecutor
import asyncio
import contextvars
ctx = contextvars.ContextVar('ctx', default=None)
pool = ProcessPoolExecutor(max_workers=2)
def task():
print(f'inside pool process, ctx: {ctx.get()}')
ctx.set('co co')
return ctx.get()
async def execute():
loop = asyncio.get_event_loop()
ctx.set('yo yo')
ctx_from_pool = await loop.run_in_executor(pool, task)
ctx_from_async = ctx.get()
print(f'ctx_from_async: {ctx_from_async}')
print(f'ctx_from_pool: {ctx_from_pool}')
ctx.set('bo bo')
def main():
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.ensure_future(execute()))
ctx_from_main = ctx.get()
print(f'ctx_from_main: {ctx_from_main}')
main()
输出:
inside pool process, ctx: yo yo
ctx_from_async: yo yo
ctx_from_pool: co co
ctx_from_main: None
我的理解是,进程池将contextvars更改为不传播到主进程的原因是,在分配任务时,使用pickle创建变量的副本,因此更改是在变量的不同副本上进行的,而不是在主进程访问的副本上进行的。然而,我不完全确定这一点,因为我没有太多的经验与ProcessPoolExecutor。 有人能给同样的问题再加些说明吗?另外,可以做些什么来跨asyncio循环和进程池executor无缝地操作contextvars?你知道吗
目前没有回答
相关问题 更多 >
编程相关推荐