Python Twisted:用于背景非返回处理的叉子



如何正确划分扭曲的子进程,该过程不使用扭曲的任何内容(而是使用父进程中的数据)(例如,处理父母的一些数据的"快照"处理并将其写入文件,而不会阻止)?

,如果我在os.fork()之后的子进程中进行了干净的关闭工作,它将关闭父进程中的某些插座/描述符;避免我看到的唯一方法是做os.kill(os.getpid(), signal.SIGKILL),这似乎是一个坏主意(尽管不是直接问题)。

(此外,如果在父过程中更改了dict,它是否会在子过程中也会改变吗?快速测试表明它不会更改。

IReactorProcess.spawnProcess(通常可作为from twisted.internet import reactor; reactor.spawnProcess可用)可以产生运行系统上任何可用可执行文件的过程。子过程不需要使用扭曲,甚至甚至在Python中。

不要亲自调用os.fork。正如您发现的那样,它与过程状态具有许多非常特殊的互动,spawnProcess将为您进行管理。

os.fork的问题包括:

  • 分叉复制您当前的过程状态,但不复制线程状态。这意味着,在修改某些全球状态的任何线程中,任何线程都会使事情发生一半,可能会拿着一些永远不会释放的锁。您的应用程序中不运行任何线程吗?您是否审核了您使用的每个库,每个库的依赖项,以确保它们都没有或
  • 您可能会认为自己只触摸应用程序内存的某些区域,但是由于Python的参考计数,您甚至在外围观察(或存在于堆栈中)的任何对象都可能会增加或减少参考计数。增加或减少重新数是一个写操作,这意味着整个 page (不仅仅是一个对象)被复制到您的过程中。因此,Python中的分叉过程往往会积累大复制的集合,例如叉状c程序。
  • 许多库的库,构成MacOS和iOS上系统的库的所有库,无法正确处理fork(),如果您在fork之后但exec之前尝试使用它们,则只会崩溃您的程序。
  • 有一个标志可以告诉文件描述符在exec上关闭 - 但是没有这样的标志可以在fork上关闭它们。因此,如果您不仔细管理访问权限,则任何文件(包括日志文件,再一次,您可能甚至不知道的库打开的任何背景临时文件)都可能会被静止损坏或截断。

最新更新