解决:使用 ProcessPoolExecutor submit 时子进程不运行 代码:解决方案:

问题描述

我正在尝试使用 while True 异步运行 2 个具有 ProcesspoolExecutor 循环(阻塞)的函数。这两个函数访问同一个共享数组,它的类型是 multiprocessing.Array。数组 (movement) 位于其自己的名为 .pysmglobals.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 (将#修改为@)