python - 使用多处理的问题

标签 python multiprocessing pool

也许你可以帮助我找到我在设置多处理函数时的错误。 我设置了一个辅助函数,用于获取数据(float 类型)并计算平均值。 如果我使用以下代码(使用 join()),则不会启动多重处理,每个 for 循环都会依次进行。计算出正确的值。

相反的是,当我删除 join() 函数时,并行处理已启用,但会出现错误,并且大多数计算数据是相同的。工作进程似乎不使用自己的列表变量。 你能给我一个提示吗?谢谢。斯特凡

for hostgroup in hostgroups:
jobs = []
#multiprocessing.log_to_stderr(logging.DEBUG)
p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
jobs.append(p)
p.start()
p.join()

更新,正在与 Pool 一起使用,但仍然不并行:

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=number_of_processes)
for hostgroup in hostgroups:
    result = pool.apply_async(worker, [hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name])
    print result.get(timeout=30)

更新,这似乎是并行工作的,但只有某些进程正确结束(总是不同):

number_of_processes = len(hostgroups)
if __name__ == '__main__':
pool = multiprocessing.Pool()
results = []
for hostgroup in hostgroups:
    results.append(pool.apply_async(worker,[hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name]))
pool.close()
pool.join()

最佳答案

p.join() 将阻塞您的主线程,直到进程完成其工作。为了获得真正的并行性,您需要在调用 join() 之前启动所有作业。

代码示例

jobs = []
for hostgroup in hostgroups:
    p = multiprocessing.Process(target=worker, args=(hostgroup,hostsfile,mod_inputfile,outputdir,testmode,backup_dir,start_time,end_time,rrdname,unit,yesterday,now_epoch,rrd_interval,rrd_heartbeat,name))
    jobs.append(p)
    p.start()
[p.join() for p in jobs]

关于python - 使用多处理的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11718224/

相关文章:

python - 平凡仿函数

python - os.fork() 之后的共享对象

c++ - 只有一个连接到数据库和使用函数,C++

ruby - 是否可以列出当前池中的所有数据库连接?

单进程的Python多处理速度

python - 在 Python 中使用 open 函数和循环

javascript - 如何从 Javascript/React 发送 AJAX 请求并在 Python REST API 中接收数据

python - Anaconda Python : Delete . pkgs 中的 tar.gz

python - 如何处理 Python 多处理数据库并发,特别是使用 django?

python - 使用多处理的并行计算 combination_with_replacement