python多进程报错

以下这段代码,在pycharm的终端和vscode中能正常运行,但是在pycharm的python console中运行报错。已在pycharm中更新过multiprocessing模块

from multiprocessing import Process, Queue
import time

def print_num(name, q):
    while not q.empty():
        print("{}\t\t{}".format(name, q.get()))
        time.sleep(0.1)


if __name__ == "__main__":
    q = Queue(20)
    for i in range(20):
        q.put(i)

    ps = []
    for i in range(4):
        p = Process(target=print_num, args=("进程 " + str(i), q))
        ps.append(p)

    for i in ps:
        i.start()
    for p in ps:
        p.join()
Traceback (most recent call last):
  File "C:\Users\spiderx\AppData\Roaming\Python\Python37\site-packages\IPython\core\interactiveshell.py", line 3553, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "", line 1, in 
    runfile('C:\\Users\\spiderx\\Documents\\python\\头条\\Demo.py', wdir='C:\\Users\\spiderx\\Documents\\python\\头条')
  File "C:\install\PyCharm\plugins\python-ce\helpers\pydev\_pydev_bundle\pydev_umd.py", line 198, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "C:\install\PyCharm\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "C:\Users\spiderx\Documents\python\头条\Demo.py", line 21, in 
    i.start()
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\process.py", line 112, in start
    self._popen = self._Popen(self)
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 223, in _Popen
    return _default_context.get_context().Process._Popen(process_obj)
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\context.py", line 322, in _Popen
    return Popen(process_obj)
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\popen_spawn_win32.py", line 89, in __init__
    reduction.dump(process_obj, to_child)
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\reduction.py", line 60, in dump
    ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <function print_num at 0x00000127DBEBE0D8>: attribute lookup print_num on __main__ failed
Traceback (most recent call last):
  File "", line 1, in 
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 105, in spawn_main
    exitcode = _main(fd)
  File "C:\Users\spiderx\AppData\Local\Programs\Python\Python37\lib\multiprocessing\spawn.py", line 115, in _main
    self = reduction.pickle.load(from_parent)
EOFError: Ran out of input

img

img

这是由于Pythonconsole中不支持多进程导致的。你可以尝试在pycharm中更改配置,让它支持多进程,或者尝试使用其他编辑器,如vscode。或可能是因为pythonconsole中不支持pickle序列化,可以尝试使用其他方法来替代pickle序列化,比如使用json序列化。