Python线程队列与多处理管道

问题描述 投票:0回答:1

我正在构建一个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()
python multithreading queue pipe
1个回答
-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.