2014-11-08 93 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