0

在我的项目中,我有两个模块:mainapi. main导入api以执行某些 API 调用,并api导入main以使用其中定义的日志记录函数。代码看起来像这样

内部main模块:

import asyncio
import multiprocessing
import api

def log(msg):
    print(multiprocessing.current_process().pid). # prints out a different pid than the main process, I don't understand why
    with lock: # raises NameError: name 'lock' is not defined
        some_log_func(msg)

async def main():
    global lock

    lock = multiprocessing.Lock()
    
    data = await api.query()

    # ... some multiprocessing stuff


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    try:
        loop.run_until_complete(main())
    finally:
        loop.close()

内部api模块:

import main

async def query():
    main.log('Querying...') # causes the NameError shown above
    # do some stuff

如前所述,运行main模块会引发NameError: name 'lock' is not defined. 我multiprocessing.Pool在模块中使用了稍后,main但是在发生此错误时,它正在主进程中运行,并且池尚未初始化。

我在哪里错了?

还值得注意的是,我的log函数也用于工作进程,所以我一直在打印当前进程的 pid 以进行调试,虽然我还没有产生任何进程,但当log函数被调用时,它会打印出一个不属于主进程的pid(我猜 async/await 在内部使用单独的进程?)。如果它确实使用单独的进程,那么这将是有意义的,因为不会在该子进程中定义全局变量,但如果是这样,有没有办法让子进程继承锁?

4

0 回答 0