问题描述
我正在尝试使用 while True
异步运行 2 个具有 ProcesspoolExecutor
循环(阻塞)的函数。这两个函数访问同一个共享数组,它的类型是 multiprocessing.Array
。数组 (movement
) 位于其自己的名为 .py
的 smglobals.py
文件中,而 takeInput
函数位于与此代码位于同一目录中的另一个 python 文件中:
代码:
# multiprocessing
from concurrent.futures import ProcesspoolExecutor
from multiprocessing import process,shared_memory,Lock
from multiprocessing import Process,Array,Pool
import multiprocessing
from video_input import takeInput
from smglobals import movement
import numpy as np
# misc
import keyboard
from termcolor import colored
def printMovement(movement : Array):
# print(colored(f'{name}: from game','blue'))
# existing_shm = shared_memory.SharedMemory(name= name)
# movement = np.ndarray((3,),dtype= np.uint8,buffer= existing_shm.buf)
print(f'movement = {movement[:]},type = {type(movement[0])}')
while True:
for i in range(len(movement)):
if movement[i] != 0:
print(movement[:])
if keyboard.is_pressed('q'):
print(f'exiting')
break
def initMovement():
import smglobals
smglobals.movement = Array('i',3)
for i in range(len(smglobals.movement)):
smglobals.movement[i] = 0
if __name__ == '__main__':
initMovement()
with ProcesspoolExecutor(max_workers=2) as executor:
executor.submit(takeInput,(movement,))
executor.submit(printMovement,))
# just for testing
print('hi guy')
这两个函数的第一行(在无限循环之前)都有一个 print
行,并且它们都不会触发。 hi guy
会被打印出来,而不会被打印出来。
编辑
takeInput
函数使用 tensorflow-gpu
更改movement
数组,并预测模型。也许这与问题有关?
完整的输出是:
2021-05-10 12:21:54.919854: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
hi guy
2021-05-10 12:21:58.169961: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
2021-05-10 12:21:58.169971: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library cudart64_110.dll
停在加载部分
解决方案:
问题在于我包含 tensorflow
的方式。
如果 tensorflow
在子进程中运行时包含在函数中,则将无法正常运行。
查看this post的答案。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)