python中Process类调用Queue的对象会报错

form multiprocessing import Queue,Process

def add(q)
q.put(1)
q.get()

if name =="main":
q=Queue
a = Process(target=add,args=(q,))
a.start()

报错内容:FilenNotFoundError:[Errno 2]No such file or directory

你这代码错误很多,特别是中文符号和英文符号混用,缩进也没有。

该回答引用ChatGPT-3.5,仅供参考,不保证完全正确

在你的代码中存在几个问题。首先,你没有正确引入QueueProcess类。在from multiprocessing import Queue, Process语句中,你需要在multiprocessing之前加上一个点号(.)或一个下划线(_)来正确引入这两个类。

其次,在定义add函数时,你忘记了函数体的冒号(:),导致语法错误。请将add函数的定义修改为:

def add(q):
    q.put(1)
    q.get()

最后,你在创建Queue对象时,缺少了后面的括号。应该将q = Queue修改为q = Queue(),以调用Queue类的构造函数创建一个实际的队列对象。

下面是修改后的代码示例:

from multiprocessing import Queue, Process

def add(q):
    q.put(1)
    q.get()

if __name__ == "__main__":
    q = Queue()
    a = Process(target=add, args=(q,))
    a.start()

请注意,这只是修正了你提供的代码中的语法错误。如果还有其他问题或错误,可能需要进一步调试和修改。


该回答引用NewBing,仅供参考,不保证完全正确

您的问题是关于python中Process类调用Queue的对象会报错的。这是一个常见的错误,可能是由于以下原因造成的:

  • 您使用了spawn方法来创建子进程,这是MacOS和Windows的默认方法¹。这种方法会导致子进程无法正确地访问父进程共享的并发原语(如Queue)¹。
  • 您没有正确地初始化Queue对象,而是使用了q=Queue而不是q=Queue()²。这会导致q变成一个类而不是一个实例,从而无法使用put和get方法²。
  • 您的主进程在子进程完成之前就结束了,导致子进程无法连接到主进程创建的Queue对象¹。

为了解决这个错误,您可以尝试以下方法:

  • 更改创建子进程的方法,使用forkforkserver代替spawn¹。这可以通过在程序开始时调用multiprocessing.set_start_method(method)来实现¹。
  • 确保您正确地创建了Queue对象,使用q=Queue()而不是q=Queue²。
  • 在主进程中加入一个阻塞语句,如process.join()time.sleep(seconds),以确保主进程等待子进程完成¹。

源: 与必应的对话, 2023/7/18
(1) Fix FileNotFoundError With Multiprocessing in Python. https://superfastpython.com/filenotfounderror-multiprocessing-python/.
(2) Python 3.6+: Nested multiprocessing managers cause FileNotFoundError. https://stackoverflow.com/questions/56641428/python-3-6-nested-multiprocessing-managers-cause-filenotfounderror.
(3) python multiprocessing manager list error: [Errno 2] No such file or .... https://stackoverflow.com/questions/29702157/python-multiprocessing-manager-list-error-errno-2-no-such-file-or-directory.