Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python的ThreadPool';s的多处理挂起_Python_Multithreading_Threadpool - Fatal编程技术网

python的ThreadPool';s的多处理挂起

python的ThreadPool';s的多处理挂起,python,multithreading,threadpool,Python,Multithreading,Threadpool,我的一个单元测试出现了幻觉问题。 我使用multiprocessing中的ThreadPool包包装stdout和stderr类中的函数,使用paramiko。在创建过程中,我使用下面的代码进行了一些真实的测试,效果很好。但在为该代码编写单元测试时,我遇到了问题,ThreadPool的这种用法被搁置了 这一部分在95%的时间内都会挂起,有时会正确执行 我在调试期间检查了这些值,发现有时有一个或其他条件设置为finished,但另一个没有设置。但是这两个函数都已经完成了,所以结果只是询问未来永远不

我的一个单元测试出现了幻觉问题。 我使用
multiprocessing
中的
ThreadPool
包包装
stdout
stderr
类中的函数,使用
paramiko
。在创建过程中,我使用下面的代码进行了一些真实的测试,效果很好。但在为该代码编写单元测试时,我遇到了问题,
ThreadPool
的这种用法被搁置了

这一部分在95%的时间内都会挂起,有时会正确执行

我在调试期间检查了这些值,发现有时有一个或其他条件设置为finished,但另一个没有设置。但是这两个函数都已经完成了,所以结果只是询问未来永远不会改变的状态

复制代码(具有此问题所需的功能):


像往常一样,我在花了一段时间咒骂和喝茶之后找到了答案

解决方案是在关闭后添加以下方法:

stdout_t.join()
stderr_t.join()
因此,这是整个修复零件:

def __fetch_streams(self, stdout_func, stderr_func):
    stdout_t = ThreadPool(processes=1)
    stderr_t = ThreadPool(processes=1)

    self.__stdout_async_r = stdout_t.apply_async(func=stdout_func)
    self.__stderr_async_r = stderr_t.apply_async(func=stderr_func)
    stdout_t.close()
    stderr_t.close()
    stdout_t.join()
    stderr_t.join()

像往常一样,我在花了一段时间咒骂和喝茶之后找到了答案

解决方案是在关闭后添加以下方法:

stdout_t.join()
stderr_t.join()
因此,这是整个修复零件:

def __fetch_streams(self, stdout_func, stderr_func):
    stdout_t = ThreadPool(processes=1)
    stderr_t = ThreadPool(processes=1)

    self.__stdout_async_r = stdout_t.apply_async(func=stdout_func)
    self.__stderr_async_r = stderr_t.apply_async(func=stderr_func)
    stdout_t.close()
    stderr_t.close()
    stdout_t.join()
    stderr_t.join()