Python线程队列与多处理管道

时间:2018-01-18 04:43:17

标签: python multithreading queue pipe

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

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

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

发生了什么事?

提前致谢。

这些是我使用的代码

与管道沟通的两个流程

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()

2 个答案:

答案 0 :(得分:1)

stack overflow question在Pipe()和Queue()之间进行了良好的性能比较。

通过多处理,两个进程可以并行运行,而无需关心Developer Richtofen所述的全局解释器锁(GIL),而多线程则在同一进程空间中产生两个线程。因此,经过精心设计的多进程比多线程性能更好。

答案 1 :(得分:-1)

有一个叫做GIL(全局解释器锁)的东西,它不能让python在CPU绑定计算上正确地与多个线程一起工作(以防万一) 另外,您应该考虑在I / O边界计算中使用线程(例如等待用户/文件或函数输入) CPU绑定计算的过程和过程(例如计算倍数算法或本例中的“循环”)