在我的项目中,我有两个模块:main和api. 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 在内部使用单独的进程?)。如果它确实使用单独的进程,那么这将是有意义的,因为不会在该子进程中定义全局变量,但如果是这样,有没有办法让子进程继承锁?