【发布时间】:2010-09-06 14:35:33
【问题描述】:
如何使用 Python 实现一些逻辑,使我能够在 Windows 上通过 fork() 系统调用重现我在 Linux 上的功能?
我专门尝试在 SAPI Com 组件上执行一个方法,同时在主线程中继续执行其他逻辑而不阻塞或等待。
【问题讨论】:
标签: python windows process subprocess fork
如何使用 Python 实现一些逻辑,使我能够在 Windows 上通过 fork() 系统调用重现我在 Linux 上的功能?
我专门尝试在 SAPI Com 组件上执行一个方法,同时在主线程中继续执行其他逻辑而不阻塞或等待。
【问题讨论】:
标签: python windows process subprocess fork
使用 python multiprocessing module 可以在任何地方使用。
这是一个IBM developerWords article,它展示了如何从 os.fork() 转换为多处理模块。
【讨论】:
fork(),因此有一些注意事项,主要是确保任何脚本都受到 if __name__ == "__main__" 保护如果要调用任何执行多处理的代码。生成的进程重新开始,需要加载模块才能重建状态。
multiprocessing.Process()的参数是否被序列化以传递给新进程?我编写了 SSL 客户端服务器应用程序。服务器为收到的每个请求派生新进程,但正在提高 TypeError: cannot serialize socket object。对简单(非 SSL)套接字执行相同操作,就像 explained here。但我不确定,因为错误源自socket.py, line 185, in __getstate__。
fork()已经实际上在 Windows 中被复制,在 Cygwin 下,但它非常多毛。
Cygwin 中的 fork 调用特别有趣,因为它不能很好地映射到 Win32 API 之上。这使得正确实施非常困难。
请参阅 The Cygwin User's Guide 了解有关此 hack 的说明。
【讨论】:
来自 Eli 的 Threading 示例将运行线程,但不执行该行之后的任何工作。
我将研究处理模块和子流程模块。我认为我正在运行的 com 方法需要在另一个进程中,而不仅仅是在另一个线程中。
【讨论】:
multiprocessing 模块是标准库的一部分。 subprocess 适合外部程序,multiprocessing 适合 python 代码。
除了 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!"
【讨论】:
您可能还喜欢使用处理模块 (http://pypi.python.org/pypi/processing)。它具有许多功能,可以使用与线程模块相同的 API 编写并行系统...
【讨论】:
processing 是标准库的一部分,作为 multiprocessing。
可能是 python 的 spawn() 版本? http://en.wikipedia.org/wiki/Spawn_(operating_system)
【讨论】:
multiprocessing 这些天在 Windows 上所做的事情。 docs.python.org/3.5/library/…