没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
python multiprocessing多进程变量共享与加锁的实现多进程变量共享与加锁的实现
主要介绍了python multiprocessing多进程变量共享与加锁的实现,文中通过示例代码介绍的非常详细,对大家
的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
python多进程和多线程是大家会重点了解的部分,因为很多工作如果并没有前后相互依赖关系的话其实顺序并不是非常的重
要,采用顺序执行的话就必定会造成无谓的等待,任凭cpu和内存白白浪费,这是我们不想看到的。
为了解决这个问题,我们就可以采用多线程或者多进程的方式,(多线程我们之后再讲),而这两者之间是有本质区别的。就
内存而言,已知进程是在执行过程中有独立的内存单元的,而多个线程是共享内存的,这是多进程和多线程的一大区别。
利用利用Value在不同进程中同步变量在不同进程中同步变量
在多进程中,由于进程之间内存相互是隔离的,所以无法在多个进程中用直接读取的方式共享变量,这时候就可以用
multiprocessing库中的 Value在各自隔离的进程中共享变量。
下面是一个多进程的例子:
假设有一个counter用来记录程序经过的总循环次数,每调用一次count函数之后counter就会增加20,在主程序中用循环开10
个进程分别调用count函数,那么理想状态下,在十个进程中共享的counter值到程序结束后应该是200。
from multiprocessing import Process, Value
import time
def count(v):
for i in range(20):
time.sleep(0.01)
v.value += 1
def main():
value = Value('i',0)
processes = [Process(target=count, args=(value,)) for i in range(10)]
for p in processes:
p.start()
for p in processes:
p.join()
print(value.value)
if __name__ == '__main__':
for i in range(10):
main()
运行这个例子,会得到怎样的结果呢?
188
180
168
186
183
179
186
181
166
186
我在主程序里运行了十次这个程序,而最后的结果是160-180之间,总之,没有一次到200。这是什么原因呢?
相信很多人都已经明白了问题所在,那就是因为在multiprocessing库中的Value是细粒度的,Value中有一个ctypes类型的对
象,拥有一个value属性来表征内存中实际的对象。Value可以保证同时只有一个单独的线程或进程在读或者写value值。这么
看起来没有什么问题。
然而在第一个进程加载value值的时候,程序却不能阻止第二个进程加载旧的值。两个进程都会把value拷贝到自己的私有内存
然后进行处理,并写回到共享值里。
那么这么会出现什么问题呢?
最后的共享值只接收到了一次值的增加,而非两次。
利用利用Lock在不同进程共享变量时加锁在不同进程共享变量时加锁
资源评论
weixin_38680811
- 粉丝: 2
- 资源: 943
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功