Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.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多处理子进程上调用.join()会试图关闭空闲shell?_Python_Multiprocessing_Python Multiprocessing_Python Idle - Fatal编程技术网

为什么在Python多处理子进程上调用.join()会试图关闭空闲shell?

为什么在Python多处理子进程上调用.join()会试图关闭空闲shell?,python,multiprocessing,python-multiprocessing,python-idle,Python,Multiprocessing,Python Multiprocessing,Python Idle,以下python脚本: import multiprocessing as mp def f(): return None def main(): print('create') p = mp.Process(target=f) print('start') p.start() print('join') p.join() print('done') if __name__ == '__main__': main()

以下python脚本:

import multiprocessing as mp

def f():
    return None

def main():
    print('create')
    p = mp.Process(target=f)
    print('start')
    p.start()
    print('join')
    p.join()
    print('done')

if __name__ == '__main__':
    main()
以Python IDLE生成以下输出:

Python 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
===================== RESTART: /home/user/Desktop/test.py =====================
create
start
join
接着是(意外的!)GUI提示“您的程序仍在运行!是否要终止它?”

有什么线索吗?我知道在空闲状态下从子进程打印很复杂,但这似乎无关

请注意,从终端运行相同的代码会给出“正常”输出,并正常退出:

[user@localhost Desktop]$ python test.py 
create
start
join
done
[user@localhost Desktop]$ python --version
Python 3.7.6
[user@localhost Desktop]$ 
在一位同事的建议下,我尝试将
mp.set\u start\u method('spawn')
添加到
if\uuuuu name\uuuu=='\uuu main\uuu':
块:

import multiprocessing as mp

def f():
    return None

def main():
    mp.set_start_method('spawn')
    print('create')
    p = mp.Process(target=f)
    print('start')
    p.start()
    print('join')
    p.join()
    print('done')

if __name__ == '__main__':
    main()
这导致IDLE表现得像我希望的那样:

Python 3.7.6 (default, Jan 30 2020, 09:44:41) 
[GCC 9.2.1 20190827 (Red Hat 9.2.1-1)] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> 
===================== RESTART: /home/user/Desktop/test.py =====================
create
start
join
done
>>> 

您只从主进程打印,我就可以在Windows上使用3.7.7、3.8.2和3.9.0a4“完成”(在空闲状态下运行)。任何旧的,你错过了最近的错误修复。空闲在其他系统上不应有所不同。在不空闲的情况下运行代码,以便更好地了解问题所在。嗨@TerryJanReedy!谢谢你看这个。在提示符处(gnome终端中的python test.py)从相同版本的python(3.7.6)运行相同的代码可以正常工作(到达“完成”并正常退出)。3.7.6是上周新安装的Fedora 31上的python版本,随后是完整的“sudo dnf更新”。我知道升级是可取的,但我敢打赌很多Fedora用户也使用3.7.6.3.7.7是最近的版本,可能在Fedora上仍然存在同样的问题。在终端中尝试
python-midlelib test.py
,然后从空闲编辑器运行。终端中是否出现任何异常或错误消息?