2012-10-10 32 views
1

我使用OpenERP,一個基於Python的ERP,它使用不同的線程(每個客戶端一個線程等)。我想用multiprocessing.Process()來fork()並調用一個長時間運行的方法。分叉後運行線程會發生什麼?

我的問題是:父母的線程會發生什麼?他們會被複制並繼續運行嗎?子進程是否會在服務器套接字上調用accept()?

感謝您的回答,

回答

3

分叉不復制線程,只有主線程。所以要非常小心與分叉多線程應用程序,因爲它可能會導致不可預知的副作用(例如,當一些線程正在一個互斥關鍵部分執行時發生分叉),除非你知道你的代碼,否則真的可以在你的分叉進程中被破壞'理想地分叉。

儘管我上面所說的一切都是真實的,但有一個解決方法(至少在Linux上)稱爲pthread_atfork(),當進程分叉時(您可以重新創建所有需要的線程)充當回調。雖然它適用於C應用程序,但它不適用於Python應用程序。

欲瞭解更多信息,可以參考:

+0

我不確定要明白,如果父母的線程沒有在孩子中複製,爲什麼這會成爲問題?父母的線程繼續在父母身上執行自己,在孩子中,我可以運行我的功能,從事一些基本工作。你能提供一個可能發生的問題的例子嗎?謝謝。 –

+1

@ThibautD。我們來看一下這個例子。你在內存中有一個可以保存某些應用程序狀態的字典。你的線程設置一個鎖,改變這個字典(例如,改變字典的鍵值)並釋放該鎖。在一段時間內,字典被鎖定,它具有不一致(中斷)狀態(有些更改已完成,有些仍在等待應用)。在這個可怕的時刻,你會分享你的過程。結果:您收到中斷狀態。 –

相關問題