在Windows中复制fork()的最佳方法是什么?

23

我该如何实现一些逻辑,以便在Windows上使用Python复制Linux中使用fork()系统调用的功能?

具体来说,我正在尝试在SAPI Com组件上执行一个方法,同时继续主线程中的其他逻辑,而不会阻塞或等待。

7个回答

18

3
这是正确的答案,但由于Windows上缺少fork(),因此有一些注意事项,其中主要的一点是确保任何脚本都受到if __name__ == "__main__"保护,如果它要调用任何进行多进程处理的代码。生成的进程从头开始,并需要加载模块以能够重构状态。 - clacke
multiprocessing.Process()传递的参数是否被序列化以便传递给新进程?我编写了一个SSL客户端服务器应用程序。服务器为每个接收到的请求派生一个新进程,但会引发TypeError:cannot serialize socket object错误。使用简单(非SSL)套接字进行相同操作可以正常工作,如此处所述。但是我不确定错误是否源自socket.py, line 185, in __getstate__ - Mahesha999

10

事实上,fork()已经在Windows下通过Cygwin复制了,但这相当棘手。

Cygwin中的fork调用特别有趣,因为它不能很好地映射到Win32 API之上。这使得正确实现它非常困难。

请参阅Cygwin用户指南以了解此技巧的说明。


3
请看一下os模块中的进程管理函数。该模块提供了许多不同方式启动新进程的函数,包括同步和异步。
还要注意的是,Windows系统没有类似于其他系统上的fork()功能。如果想在Windows上进行多进程处理,需要使用threading模块

8
"subprocess"和"multiprocessing"(由RJBrady建议)可能是比"os"和"threading"更好的选择。 - jfs

3

除了Greg指出的os模块中的进程管理代码外,您还应该查看threading模块: https://docs.python.org/library/threading.html

    from threading import Thread
    
    def separate_computations(x, y):
        print sum(x for i in range(y))  # really expensive multiplication
    
    Thread(target=separate_computations, args=[57, 83]).start()

    print "I'm continuing while that other function runs in another thread!"

3

Eli的多线程示例可以运行线程,但在该行之后不会执行任何工作。

我将研究处理模块和子进程模块。我认为我正在运行的com方法需要在另一个进程中,而不仅仅是在另一个线程中。


2
multiprocessing 模块是标准库的一部分。subprocess 适用于外部程序,而 multiprocessing 则适用于 Python 代码。 - jfs

2

1
从Python 2.6/3.0(2008年10月和12月)开始,“processing”已作为“multiprocessing”成为标准库的一部分。 - clacke

0

这就是multiprocessing在Windows上的工作方式。https://docs.python.org/3.5/library/multiprocessing.html?highlight=spawn#contexts-and-start-methods - clacke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接