我在Windows上的Python 3.11中有一个问题。
这是脚本:
from multiprocessing import Process
import os
import time
def info(title):
print(title)
print('module name:', __name__)
if hasattr(os, 'getppid'): # only available on Unix
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('--- hello', name)
time.sleep(5)
print('--- bye', name)
def some_func():
print('Running some_func function')
def another_func():
print('Running another_func function')
def main():
print('Running main function of try_multi.py')
print('-------------------------------------')
some_func()
if __name__ == '__main__':
info('main line')
p1 = Process(target=f, args=('bob',))
p2 = Process(target=f, args=('larry',))
p1.start()
p2.start()
p1.join()
p2.join()
another_func()
main()
这是输出:
C:Scripts> c:Python31python.exe try_multi.py
Running main function of try_multi.py
-------------------------------------
Running some_func function
main line
module name: __main__
process id: 12696
Running main function of try_multi.py
-------------------------------------
Running some_func function
Running another_func function
function f
module name: __main__
process id: 14568
--- hello bob
Running main function of try_multi.py
-------------------------------------
Running some_func function
Running another_func function
function f
module name: __main__
process id: 9336
--- hello larry
--- bye bob
--- bye larry
Running another_func function
问题是我期望在新过程中仅运行函数" f",但看起来始于父脚本的全新实例 - " some_fun"one_answers" erno_fun"one_answers" erno_func"运行。
在python 2.7.5上的Linux上,它按预期工作:
$ python try_multi.py
Running main function of try_multi.py
-------------------------------------
Running some_func function
main line
('module name:', '__main__')
('parent process:', 1137)
('process id:', 1167)
function f
('module name:', '__main__')
('parent process:', 1167)
('process id:', 1168)
('--- hello', 'bob')
function f
('module name:', '__main__')
('parent process:', 1167)
('process id:', 1169)
('--- hello', 'larry')
('--- bye', 'bob')
('--- bye', 'larry')
Running another_func function
我可以在平台上正确工作(Windows上的Python 3.11(吗?谢谢
在文档中的编程指南中解释了这一点:
确保可以由新的python解释器安全地导入主模块,而不会引起意外副作用(例如启动新过程(。
通常,这意味着您想从此更改脚本的最后一行:
main()
…对此:
if __name__ == '__main__':
main()
否则,每个新的子进程都会启动,并立即尝试调用main
并产生两个新过程。这是仅进的,还是无限深处并散开您的系统,还是提出例外取决于所有不值得进入的细节,但它永远不会在Windows上做正确的事情。
如果您想知道为什么它在Linux上工作:在Windows上,multiprocessing
可以通过启动全新的Python解释器并使其导入并运行模块,从而可以运行模块中的所有顶级代码;在Linux上,它可以通过分配当前解释器进程的副本,然后从那里开始任务,因此它实际上不需要重新运行脚本,因此顶级代码通常不会重新执行。<<<<<<
在python的后期版本中(3.1真的很古老……(,他们已经清理了一点,使它们更加灵活,因此您可以通过指定set_start_method('spawn')
在两个平台上获得相同的行为,例如在两个平台上获得相同的行为。但是基本默认结果将相同。