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线程队列与多处理管道的主要内容,如果未能解决你的问题,请参考以下文章