Python线程队列与多处理管道

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python线程队列与多处理管道相关的知识,希望对你有一定的参考价值。

我正在构建一个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()

与Queue通信的两个线程

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

有一些叫做GIL(全局解释器锁),它不允许python在CPU绑定计算上正确使用多个线程(就像这样的情况)另外你应该考虑在I / O绑定计算中使用线程(比如等待)用户/文件或功能输入)和CPU绑定计算的过程(如计算多次算法或在本例中为循环)

以上是关于Python线程队列与多处理管道的主要内容,如果未能解决你的问题,请参考以下文章

Python 队列queue与多线程组合(生产者+消费者模式)

Python队列与多线程及文件锁

队列与多线程间关系——个人理解

Python3 异步编程之进程与线程-1

Python 多处理与多线程相结合

生产者消费者模型 与多线程