【问题标题】:Python Threading Queue vs multiprocessing PipePython 线程队列与多处理管道
【发布时间】:2018-06-27 02:15:26
【问题描述】:

我正在构建一个使用 Pyqt4/Pyqtgraph 作为 GUI 框架和 BLE 模块的 python 应用程序。 当前应用从BLE模块接收数据并实时显示。

我编写了一些基准代码来评估与将 BLE 模块移动到单独进程相关的开销。然而,结果却令人困惑。

处理器之间使用管道的流数据比使用队列线程之间的流数据更快。 我一直认为处理器内的通信速度更快。

发生了什么?

提前致谢。

这些是我使用的代码

两个进程与 Pipes 通信

from  multiprocessing import Process, Pipe

def worker(q):
    output_p, input_p = q
    input_p.close()
    for task_nbr in range(100000):
        message = output_p.recv()
    sys.exit(1)

def main():
    output_p, input_p = Pipe()
    Process(target=worker, args=((output_p,input_p),)).start()
    b = [i for i in range(20)]
    start_time = time.time()
    for num in range(100000):
        input_p.send(b)
    end_time = time.time()

    duration = end_time - start_time
    msg_per_sec = 100000 / duration

    print "Duration: %s" % duration
    print "Messages Per Second: %s" % msg_per_sec

if __name__ == "__main__":
    main()

两个线程与队列通信

from Queue import Queue
from threading import Thread
def worker(q):
    for x in range(100000):
        q.get("MESSAGE")
def main():
    q = Queue()
    t = Thread(target=worker,args=(q,))
    t.start()

    start_time = time.time()
    b = [i for i in range(20)]
    print b
    for x in range(100000):
        q.put(b)
    end_time = time.time()

    duration = end_time - start_time
    msg_per_sec = 100000 / duration

    print "Duration: %s" % duration
    print "Messages Per Second: %s" % msg_per_sec

if __name__ == "__main__":
    main()

【问题讨论】:

    标签: python multithreading queue pipe


    【解决方案1】:

    有一个叫做GIL(全局解释器锁)的东西,它不能让python在CPU绑定计算上正确处理多个线程(就像这样以防万一) 您还应该考虑在 I/O 绑定计算中使用线程(例如等待用户/文件或函数输入) 和 CPU 密集型计算过程(例如计算倍数算法或在本例中为 For 循环)

    【讨论】:

      【解决方案2】:

      stack overflow question 给出了 Pipe() 和 Queue() 之间的良好性能比较。

      使用多处理,两个进程可以并行运行,而无需关心Developer Richtofen 提到的全局解释器锁 (GIL),而多线程在同一进程空间中生成两个线程。所以精心设计的多进程比多线程性能更好。

      【讨论】:

        猜你喜欢
        • 2012-01-17
        • 1970-01-01
        • 2017-05-16
        • 2012-11-12
        • 1970-01-01
        • 2016-02-19
        • 2010-10-08
        • 2013-10-02
        • 2016-05-02
        相关资源
        最近更新 更多