2014-11-08 90 views
0

我試圖在Python中實現插件體系結構。Python中插件體系結構的多處理或多線程處理

我已經開始使用Threading模塊,其中每個插件是我調用使用Thread.start()方法的線程寫它(因爲所有的插件子類BasePlugin其子類Thread)。但是我剛剛遇到了multiprocessing模塊。

目前我不知道我是否應該切換到multiprocessing模塊,並使用共享內存/管材等共享數據...

我想獲得這個別人的意見。

的插件架構,我一直在工作的工作如下:由Plugin Manager收到

的事件。 Plugin Manager檢查所有訂閱了該類型事件的插件。它激活它們並向它們發送事件對象(因爲它包含附加信息)。如果其中一個插件已經激活,則不需要產生它(只需將事件對象發送給它)。

此外,還有一些資源只能在任何時間點屬於一個插件。每個插件都可以請求資源(我不擔心任何競爭情況,因爲一次不會有很多插件活動)。

回答

1

線程與主進程和對方共享內存。例如,您可以擁有一個可供所有線程使用的列表。附加到列表的項目可以被其他線程看到。但你必須小心。您必須瞭解哪些數據結構上的操作是線程安全的,哪些不是。當兩個線程檢查字典中是否存在鍵並寫入時,程序的行爲會發生什麼?

多個進程不共享內存。你開始的新過程在它產生的地方得到了一個內存的副本。

線程使用較少的資源。但可以很難推理。另一方面,流程之間的溝通很棘手。你不能只訪問任意的Python數據結構。這聽起來像你想要做的。

寫得很差的插件,如果它在一個線程中,可能會導致整個程序崩潰。而如果它是在一個單獨的過程中,這不會發生。也許這是一個考慮因素?

+0

「一個寫得不好的插件,如果它在一個線程中,可能會導致整個程序崩潰」 - 你說得對。這就是爲什麼我給任何想寫插件的人(主要是我)一個乾淨的API,所以沒有什麼不好的事情會發生。 – Shookie 2014-11-08 15:51:12

+0

優秀!儘管請記住一個線程可以完全訪問。所以,如果我正在編寫一個插件,並決定用一個空字符串替換一些中央數據結構,那麼我可以做到這一點。但是,如果這個插件系統只會在內部使用,那麼我認爲這是一個有爭議的問題。 – aychedee 2014-11-08 15:58:22