【问题标题】:What's the best way to duplicate fork() in windows?在 Windows 中复制 fork() 的最佳方法是什么?
【发布时间】:2010-09-06 14:35:33
【问题描述】:

如何使用 Python 实现一些逻辑,使我能够在 Windows 上通过 fork() 系统调用重现我在 Linux 上的功能?

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

【问题讨论】:

    标签: python windows process subprocess fork


    【解决方案1】:

    使用 python multiprocessing module 可以在任何地方使用。

    这是一个IBM developerWords article,它展示了如何从 os.fork() 转换为多处理模块。

    【讨论】:

    • 这是正确的答案,但由于 Windows 上缺少 fork(),因此有一些注意事项,主要是确保任何脚本都受到 if __name__ == "__main__" 保护如果要调用任何执行多处理的代码。生成的进程重新开始,需要加载模块才能重建状态。
    • 传递给multiprocessing.Process()的参数是否被序列化以传递给新进程?我编写了 SSL 客户端服务器应用程序。服务器为收到的每个请求派生新进程,但正在提高 TypeError: cannot serialize socket object。对简单(非 SSL)套接字执行相同操作,就像 explained here。但我不确定,因为错误源自socket.py, line 185, in __getstate__
    【解决方案2】:

    fork()已经实际上在 Windows 中被复制,在 Cygwin 下,但它非常多毛。

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

    请参阅 The Cygwin User's Guide 了解有关此 hack 的说明。

    【讨论】:

      【解决方案3】:

      看看os module中的进程管理功能。有以多种不同方式启动新进程的功能,包括同步和异步。

      我还应该注意,Windows 不提供与其他系统上的 fork() 完全相同的功能。要在 Windows 上进行多处理,您需要使用 threading 模块。

      【讨论】:

      • subprocessmultiprocessing(由 RJBrady 建议)可能是 osthreading 的更好替代品。
      【解决方案4】:

      来自 Eli 的 Threading 示例将运行线程,但不执行该行之后的任何工作。

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

      【讨论】:

      • multiprocessing 模块是标准库的一部分。 subprocess 适合外部程序,multiprocessing 适合 python 代码。
      【解决方案5】:

      除了 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!"
      

      【讨论】:

        【解决方案6】:

        您可能还喜欢使用处理模块 (http://pypi.python.org/pypi/processing)。它具有许多功能,可以使用与线程模块相同的 API 编写并行系统...

        【讨论】:

        • 从 Python 2.6/3.0(2008 年 10 月和 2008 年 12 月)开始,processing 是标准库的一部分,作为 multiprocessing
        【解决方案7】:

        可能是 python 的 spawn() 版本? http://en.wikipedia.org/wiki/Spawn_(operating_system)

        【讨论】:

        猜你喜欢
        • 2010-09-16
        • 1970-01-01
        • 2011-10-22
        • 2010-09-05
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 2010-11-13
        • 2010-11-02
        相关资源
        最近更新 更多