我正在构建一个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()
答案 0 :(得分:1)
此stack overflow question在Pipe()和Queue()之间进行了良好的性能比较。
通过多处理,两个进程可以并行运行,而无需关心Developer Richtofen所述的全局解释器锁(GIL),而多线程则在同一进程空间中产生两个线程。因此,经过精心设计的多进程比多线程性能更好。
答案 1 :(得分:-1)
有一个叫做GIL
(全局解释器锁)的东西,它不能让python在CPU绑定计算上正确地与多个线程一起工作(以防万一)
另外,您应该考虑在I / O边界计算中使用线程(例如等待用户/文件或函数输入)
CPU绑定计算的过程和过程(例如计算倍数算法或本例中的“循环”)