How to manage scope using multiprocessing(如何使用多处理管理作用域)
本文介绍了如何使用多处理管理作用域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试实现一个使用pythonmultiprocessing的函数,以加快计算速度。我正在尝试创建成对距离矩阵,但使用for循环的实现需要8个多小时。
这段代码似乎运行得更快,但当我打印时,矩阵中全是零。当我打印函数中的行时,它似乎起作用了。我认为这是范围问题,但我无法理解如何处理它。
import multiprocessing
import time
import numpy as np
def MultiProcessedFunc(i,x):
for j in range(i,len(x)):
time.sleep(0.08)
M[i,j] = (x[i]+x[j])/2
print(M[i,:]) # Check if the operation works
print('')
processes = []
v = [x+1 for x in range(8000)]
M = np.zeros((len(v),len(v)))
for i in range(len(v)):
p = multiprocessing.Process(target = MultiProcessedFunc, args =(i,v))
processes.append(p)
p.start()
for process in processes:
process.join()
end = time.time()
print('Multiprocessing: {}'.format(end-start))
print(M)
推荐答案
遗憾的是,您的代码不能以这种方式编写。多进程产生独立的进程,这意味着内存空间是独立的!一个子流程所做的更改不会反映在其他流程或您的父流程中。
严格地说,这不是作用域问题。作用域是在单个解释器进程中定义的内容。模块does provide means of sharing memory between processes,但这是有代价的(由于锁定等问题,共享内存速度要慢得多。
现在,NumPy有了一个很好的特性:it releases the GIL during computation。这意味着使用MULTIthreading而不是multiprocessing应该会给您带来一些好处,只需将import multiprocessing替换为import threading并将multiprocessing.Process替换为threading.Thread即可。代码应该会产生正确的结果。在我的机器上,删除print语句和它运行的sleep代码不到8秒:
Multiprocessing: 7.48570203781
[[1.000e+00 1.000e+00 2.000e+00 ... 3.999e+03 4.000e+03 4.000e+03]
[0.000e+00 2.000e+00 2.000e+00 ... 4.000e+03 4.000e+03 4.001e+03]
[0.000e+00 0.000e+00 3.000e+00 ... 4.000e+03 4.001e+03 4.001e+03]
...
[0.000e+00 0.000e+00 0.000e+00 ... 7.998e+03 7.998e+03 7.999e+03]
[0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 7.999e+03 7.999e+03]
[0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 0.000e+00 8.000e+03]]
另一种方法是使子流程返回结果,然后将结果合并到主流程中。
这篇关于如何使用多处理管理作用域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
编程基础网
本文标题为:如何使用多处理管理作用域
基础教程推荐
猜你喜欢
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
