在Windows上的Python 3.11中调用多处理



我在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')在两个平台上获得相同的行为,例如在两个平台上获得相同的行为。但是基本默认结果将相同。

相关内容

  • 没有找到相关文章

最新更新