簡體   English   中英

python-twisted:用於后台非返回處理的fork

[英]python-twisted: fork for background non-returning processing

如何正確地將子進程分叉,不使用任何扭曲的東西(但使用來自父進程的數據)(例如,處理來自父進程的一些數據的“快照”並將其寫入文件,而不阻塞)?

看來如果我在os.fork()之后執行像子進程中的干凈關閉這樣的事情,它會關閉父進程中的一些套接字/描述符; 避免我看到的唯一方法是執行os.kill(os.getpid(), signal.SIGKILL) ,這看起來似乎是一個壞主意(雖然沒有直接問題)。

(另外,如果在父進程中更改了dict,那么它是否會在子進程中發生變化?快速測試表明它不會改變。但OS /內核是debian stable / sid)

IReactorProcess.spawnProcess (通常可from twisted.internet import reactor; reactor.spawnProcess )可以生成運行系統上任何可用可執行文件的進程。 子進程不需要使用Twisted,甚至不需要使用Python。

不要自己打電話給os.fork 正如您所發現的,它與進程狀態有很多非常特殊的交互, spawnProcess將為您管理。

os.fork的問題包括:

  • 分叉復制當前進程狀態,但不復制線程狀態。 這意味着在修改某個全局狀態的過程中的任何線程都會使事情半破,可能會保留一些永遠不會釋放的鎖。 不要在應用程序中運行任何線程? 您是否已經審核了您使用的每個庫,每個依賴項,以確保它們中沒有一個曾經或將要使用后台線程進行任何操作?
  • 您可能認為您只是觸摸應用程序內存的某些區域,但是由於Python的引用計數,您甚至可以在外圍查看(或存在於堆棧中)的任何對象都可能具有遞增或遞減的引用計數。 遞增或遞減引用計數是一種寫入操作,這意味着整個頁面 (不僅僅是那個對象)被復制回到您的進程中。 因此,Python中的分叉進程往往會累積比分叉C程序更大的復制集。
  • 許多庫, 即構成macOS和iOS系統的所有 ,都不能正確處理fork() ,如果你試圖在fork之后但在exec之前使用它們,它們會簡單地崩潰你的程序。
  • 有一個標志用於告訴文件描述符在exec上關閉 - 但沒有這樣的標志讓它們在fork關閉。 因此,如果您不仔細管理對它們的訪問,那么任何文件(包括日志文件,以及您可能甚至不知道的庫打開的任何后台臨時文件)都可能會被靜默損壞或截斷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM