【问题标题】:threads vs. processes in PythonPython 中的线程与进程
【发布时间】:2012-10-12 09:57:24
【问题描述】:

我即将使用 Python 启动一个程序,该程序主要进行轮询,它将不断地从串行端口(通过PySerial)读取并从不时更改的文件描述符中读取。我开始研究threading 模块,但后来我不断发现moremore 建议使用multiprocessing 模块。

我并不精通 Python,主要来自 C 背景。 Python 中的线程方法有哪些技术优势?

在 C 中,线程共享数据而不是必须设置一些 IPC 来进行通信,这对于 Python 来说似乎是一样的吗?

我的用例:

Main process (or thread?) -
   start & initialize
       |
       V
    spaw child----------------------> start & initialize
       |                                   |
       V                                   V
      while (1) <------------+          wait for data<------+
       |                     |             |                |
       V                     |             V                |
   read file descriptors     |         read from            |
       |                     |         serial port<-----+   |
       V                     |             |            |   |
   value changed?  ------No--+             V            |   |
       |                     ^        message done?--No-+   |
       V                     |             |                |
    Report change------------+             V                |
     over serial                       alert parent---------+

所以我在考虑线程,因为它可以更轻松地通过串行共享数据,并且它们可以拥有串行端口的共享句柄。这是有道理的吗,还是我从 Python 的角度考虑不正确?

【问题讨论】:

  • 多处理是一种(恕我直言有点笨拙)回避 GIL 的方法。在这种情况下,我认为threading 是要走的路。
  • @Downvoter - 我有什么理由让你觉得这个问题:“没有显示出研究工作;不清楚或没有用”?

标签: python multithreading serial-port multiprocessing


【解决方案1】:

multiprocessing 在 Python 中主要用于避免 GIL(全局解释器锁),它会阻止线程对尝试并行计算有用 - 对于资源访问,线程是完美的,并且是易于实现的更好选择。

GIL 意味着只有一个线程可以同时对任何 Python 对象进行操作。这意味着在您试图加快计算速度的地方,进程将受到其他线程的阻碍。在您的用例中,一个线程将只检查新输入,因此这根本不会导致任何问题。

【讨论】:

  • 真棒回答谢谢。我想我需要更多地研究 GIL。这对我来说是一个新概念。
  • 这是 CPython 的一个实现细节,人们真的太沉迷了 - 在 99% 的情况下,这真的无关紧要。
猜你喜欢
  • 1970-01-01
  • 2016-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
相关资源
最近更新 更多