Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.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 3.5多处理池和队列don';行不通_Python_Python 3.x_Multiprocessing - Fatal编程技术网

Python 3.5多处理池和队列don';行不通

Python 3.5多处理池和队列don';行不通,python,python-3.x,multiprocessing,Python,Python 3.x,Multiprocessing,我遇到了一个多处理问题。代码包括在下面。代码可以按预期执行,但当取消注释self.queue=multiprocessing.queue()时,此程序将立即退出,并且子进程似乎无法成功启动 我不知道发生了什么事。有人能帮我吗?非常感谢 import multiprocessing import time class Test: def __init__(self): self.pool = multiprocessing.Pool(1) #self.qu

我遇到了一个多处理问题。代码包括在下面。代码可以按预期执行,但当取消注释
self.queue=multiprocessing.queue()
时,此程序将立即退出,并且子进程似乎无法成功启动

我不知道发生了什么事。有人能帮我吗?非常感谢

import multiprocessing
import time

class Test:
    def __init__(self):
        self.pool = multiprocessing.Pool(1)
        #self.queue = multiprocessing.Queue()

    def subprocess(self):
        for i in range(10):
            print("Running")
            time.sleep(1)
        print("Subprocess Completed")

    def start(self):
        self.pool.apply_async(func=self.subprocess)
        print("Subprocess has been started")
        self.pool.close()
        self.pool.join()

    def __getstate__(self):
        self_dict = self.__dict__.copy()
        del self_dict['pool']
        return self_dict

    def __setstate__(self, state):
        self.__dict__.update(state)

if __name__ == '__main__':
    test = Test()
    test.start()
  • 使用apply\u async,它会立即返回。所以你应该在某处等待结果

  • 在后台,python将对子进程执行的函数进行pickle处理。但是self.process作为一个方法在这里是不可pickle的(因为self.pool属性,请参见下面ShadowRanger的注释)



我可以重现您的问题,也不会提出任何
回溯问题。
这将引发以下错误,不知道为什么:

运行时错误:队列对象只能通过继承在进程之间共享

将您的代码行替换为:

    m = multiprocessing.Manager()
    self.queue = m.Queue()  
为什么会发生这种情况?
多处理。队列
用于一个
进程
,您使用的是
多处理。池
,它使用多个
进程
,您必须使用
多处理.Manager().Queue()


用Python测试:3.4.2

任何
回溯
,如果是,请将其添加到您的问题中。@stovfl抱歉,我在Pycharm控制台中看不到任何回溯信息。如果取消对该行的注释,该程序将立即完成,而无需等待其子进程。对于记录,一般来说,酸洗方法没有任何错误。但是默认的pickle必须pickle实例本身以及它的所有属性(这些属性本身必须是可pickle的)。由于
Pool
是一个属性,并且
Pool
s不可pickable,因此不能在此类实例上传递方法,而不覆盖pickling helper方法以排除
Pool
属性。但对于实例可挑选的情况,这些方法是完全合法的<代码>池.apply_async('abc\r\n'.strip,('a\n',)
非常好,即使您传递的是一个方法,而不是一个函数。您好,谢谢,这个代码片段在Python 3.5上对我很有用。顺便问一下,您如何使RuntimeError显示出来,即使使用控制台运行,我也看不到任何错误。非常感谢@海市蜃楼:我也没看到。我在另一个项目中遇到这个运行时错误,使用
mp.Manager()
就是我找到的解决方案。我明白了。谢谢你的解释。
    m = multiprocessing.Manager()
    self.queue = m.Queue()