【问题标题】:Embedding Python thread safe嵌入 Python 线程安全
【发布时间】:2010-10-15 14:18:30
【问题描述】:

我正在尝试在模块中使用 Python 来开发车辆总线系统的分析软件。为此,我必须以线程安全的方式嵌入 Python,因为可以有多个独立工作的模块实例。我可以使用互斥锁来保护对 Python 的所有访问,并为每个线程创建一个唯一的 (python) 模块。显然这是最简单的方法,但代价是无法跨多个内核扩展。或者我可以修改我的模块以生成实习生使用 Python 并通过共享内存连接到它们的新进程。这会给我带来性能损失,并花费更多时间来实施,但扩展性很好。

我的问题:你认为女巫一更有意义吗?有没有其他方法可以嵌入 Python 线程安全,甚至可以扩展到多个内核。

向莫里茨致敬

编辑:我正在使用 CPython

【问题讨论】:

  • 这取决于你在 python 中所做的事情有多复杂,但在一般情况下,我会说使用多个解释器是正确的方法。它将大大提高灵活性和可扩展性(同时让您了解 GIL)并且您不需要每个线程模块。我认为你的项目中的其他开发人员会更容易获得结果,并且更通用。
  • 嗨 Jagerkin,如果您再次发表您的评论作为答案,我可能会接受。
  • @Jagerkin:这正是multiprocessing 库所做的。同时生成两个 Python 解释器并不像最初听起来那么简单,因为您必须关心进程/线程同步和线程/进程间通信。多处理库已经为您完成了大部分艰苦的工作,它具有“队列”、“管道”、“池”、“共享值”的多进程版本,可在 IPC/共享内存上透明地序列化和反序列化对象,以及“锁”同步多个处理,因此您不必自己做。

标签: python thread-safety multicore embedding embedded-language


【解决方案1】:

如果您受 CPU 限制,Python 只能使用多处理库扩展到多核。但是,如果您受 I/O 限制,那么线程通常就足够了。

如果您想要简单的线程安全,则使用 Queue 进行所有消息传递。

【讨论】:

  • 多处理库真的对我有帮助吗?我不在一个 Python 解释器中使用多个线程,我想使用在多个 (C++) 线程中运行的多个 Python 解释器。
  • 多处理库可以处理生成子进程(即它生成多个 python 解释器)和进程间通信(例如数据共享、同步),并且这样做避免了 GIL(全局解释器锁)。我建议在尝试在 C++ 线程上生成多个解释器之前先查看它(这将复制它们在多处理库中所做的大部分工作)。
  • 再一次,我不希望从 Python 中支持进程,如果有的话,我希望从 C 中生成新进程。那么你是在建议我研究 Multiprocessing 源代码吗?或者多处理库对我有什么帮助?我不是想自大,但我看不出你的回答对我有什么帮助。
  • 在看到问题之前,您已经看到了解决方案。由 python 生成的子进程和由 C 生成的子进程之间没有区别。您只需要稍微不同的方式来划分任务,而不是在 C 中划分任务,现在在 Python 中划分任务。此外,由于您正在为总线编写代码,因此请特别注意确保您实际使用的是多处理,因为如果库认为它无法与总线系统一起使用,它将默默地回退到线程。
【解决方案2】:

跟进我的问题:我继续使用 Processes 和实习生使用 Python 来实现它。可以在这里找到为什么多处理库没有帮助的好文本: http://pkaudio.blogspot.com/2010/04/whey-multiprocessing-doesnt-always-work.html 这不是我自己写的,但那个人和我有同样的问题。我感谢所有试图帮助我的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多