2010-05-09 54 views
11

我有一個python腳本,它使用的資源不能超過一定數量的併發腳本運行。在Python中命名的信號量?

傳統上,這將通過命名的信號量來解決,但我無法在multiprocessing模塊或threading的文檔中找到這些信號。

我缺少的東西或命名被Python沒有實現/暴露信號燈?更重要的是,如果答案是否定的,那麼效仿它的最好方法是什麼?

感謝, 波阿斯

PS。由於與此問題無關的原因,我無法將任務聚合到持續運行的進程/守護進程或使用衍生進程 - 兩者似乎都可用於python API。

回答

4

我建議像these這樣的第三方擴展,最好是posix_ipc之一 - 請參閱文檔中的sempahore部分。

這些模塊主要是以unixy的方式公開「系統V IPC」(包括信號量),但其中至少有一個(特別是posix_ipc)聲稱可以在Windows上與Cygwin一起工作(我還沒有證實要求)。在FreeBSD 7.2和Mac OSX 10.5上有一些記錄的limitations,所以請注意,如果這些平臺對您很重要。

0

您可以通過使用文件系統,而不是一個內核路徑(命名信號來實現,無論如何在某些平臺上這樣)模仿他們。你必須自己實現sem_[open|wait|post|unlink],但這樣做應該是相對微不足道的。您的同步開銷可能很大(取決於您在應用程序中擺弄信號量的頻率),因此您可能需要在啓動用於存儲命名信號量的進程時初始化虛擬硬盤。或者如果你不習慣自己滾動,你可能會將boost::interprocess::named_semaphoredocs here)包裝在一個簡單的擴展模塊中。

+2

有很多方法可以得到這個錯誤(公平,調度喚醒,比賽條件)。使用內核或libc基元(例如,真正的sem_ * API或Windows中的CreateSemaphore/event API);避免滾動你自己的同步原語。 – 2010-05-09 20:35:48

+1

這就是爲什麼我提供你可以使用提升,如果你不舒服滾動你自己的。 – 2010-05-09 21:05:25