2016-12-22 45 views
0

我一直在试验我的代码以发送“并行”命令到多个串行COM端口。Python多重处理比Windows上的多线程稍微慢

我的多线程代码包括:

global q 
q = Queue() 
devices = [0, 1, 2, 3] 
for i in devices: 
    q.put(i) 
cpus=cpu_count() #detect number of cores 
logging.debug("Creating %d threads" % cpus) 
for i in range(cpus): 
    t = Thread(name= 'DeviceThread_'+str(i), target=testFunc1) 
    t.daemon = True 
    t.start() 

和多处理代码包括:

devices = [0, 1, 2, 3] 
cpus=cpu_count() #detect number of cores 
pool = Pool(cpus) 
results = pool.map(multi_run_wrapper, devices) 

我观察到在“并行发送串行命令至4个COM端口的任务“大约需要6秒钟,多次处理总是需要0.5到1秒的额外总运行时间。

关于为什么Windows机器上的差异的任何输入?

+1

多处理总是有额外的开销与多线程。多线程使用与父进程相同的内存空间,而多进程需要为进程分配新的内存。游戏中可能有更多的因素,但这种开销是给定的。 –

回答

1

呃,其中之一,你不是把苹果与苹果比较。如果您需要等效代码,请在您的线程案例中使用multiprocessing.dummy.Pool(与线程方面的multiprocessing.Pool相同,而不是进程),因此您至少使用具有不同内部实现的相同基本并行化模型,而不是将所有内容全部更改立刻。

除此之外,启动工作人员并向他们传递数据有一些开销,在Windows上比在其他系统上花费更多,因为Windows不能便宜地产生新的进程;它必须产生一个新的Python实例,然后通过IPC将状态复制到近似分支。

除此之外,您还未提供足够的信息;您的进程和基于线程的工作者功能不提供,并可能导致行为上的显着差异。你也没有提供关于你如何执行时间的信息。同样,如果每个工作进程需要重新初始化COM端口通信库,这可能涉及不重要的开销。

+0

感谢您的输入。对于这两种方法(多线程和多处理),工作者函数完全相同,除了multihtreading中的q.put()/ q/taskdone()调用。在每个线程实例中,我正在初始化一个新的COM端口,所以它实际上并不是开销,因为我不想重新初始化相同的COM端口。就目前而言,我认为我正在开展多线程,因为它似乎对我所要做的事情非常稳定,而且也相对更快。 (使用时间库使用启停时间差来计时)。 – eecs