"""
问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱的问题
"""
'''
进程同步
'''
#多进程抢占输出资源
import os
import time
import random
from multiprocessing import Process def work(n):
print(f'{n}: {os.getpid()} is running')
# time.sleep(random.random())
time.sleep(2)
print(f"{n}: {os.getpid()} is done")
if __name__ == '__main__':
for i in range(3):
p = Process(target= work, args=(i, ))
p.start() #使用锁维护执行顺序 #由并发变成了串行,牺牲了运行效率,但避免了竞争
import os,time,random
from multiprocessing import Process,Lock def work(lock, n):
lock.acquire()
print(f'{n}: {os.getpid()} is running')
time.sleep(random.randint(1, 3))
print(f'{n}: {os.getpid()} is done')
lock.release() if __name__ == '__main__':
lock = Lock()
for i in range(3):
p = Process(target=work, args=(lock, i))
p.start()
'''加锁可以实现顺序的执行,但是程序又重新变成串行了,
浪费时间但是保证了数据安全
'''
#文件db的内容为:{"count": 1}
#注意一定要用双引号,不然json无法识别
#并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process,Lock
import time, json, random def search():#查询剩余票数
dic = json.load(open('db')) #从文件中把数据读出来
# 下面两句和上面一句的功能一样
# data = open('db')
# dic = json.load(data)
print(f'剩余票数{dic["count"]}')#打印
def get():#买票
dic = json.load(open('db')) #打开文件
time.sleep(0.1) #模拟读数据的网络延迟
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(0.2) #模拟写数据的网络延迟
json.dump(dic, open('db', 'w'))
# 下面两句和上面一句会得到相同的效果
# data = open('db', 'w')
# json.dump(dic, data)
print('购票成功')
def task():
search()
get() if __name__ == '__main__':
for i in range(100): # 模拟并发100个客户端抢票
p = Process(target=task)
p.start() #用锁来保证数据安全
from multiprocessing import Process,Lock
import time, json, random def search():#查询剩余票数
dic = json.load(open('db')) #从文件中把数据读出来
# 下面两句和上面一句的功能一样
# data = open('db')
# dic = json.load(data)
print(f'剩余票数{dic["count"]}')#打印
def get():#买票
dic = json.load(open('db')) #打开文件
time.sleep(random.random()) #模拟读数据的网络延迟
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(random.random()) #模拟写数据的网络延迟
json.dump(dic, open('db', 'w'))
# 下面两句和上面一句会得到相同的效果
# data = open('db', 'w')
# json.dump(dic, data)
print('购票成功')
def task(lock):
search()
lock.acquire()
get()
lock.release() if __name__ == '__main__':
lock = Lock()
for i in range(30): # 模拟并发30个客户端抢票
p = Process(target=task, args=(lock, ))
p.start()
"""
加锁可以保证多个进程修改同一块数据时,同一时间只
能有一个任务可以修改即串行的修改,速度慢了,但是数
据变安全了。 文件共享数据实现进程间通信,问题有:
1.效率低(共享数据基于文件,而文件是在硬盘上的数据)
2.需要自己加锁处理 我们需要:
1.效率高,(多个进程共享一块内存的数据)
2.帮我们处理好锁问题,这就是multiprocessing模块提供
的基于消息的IPC通信机制:队列和管道 注意:
队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)
实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量
避免使用共享数据,尽可能使用消息传递和队列,避免处理复
杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。 """

Python并发编程之进程同步的更多相关文章

  1. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  2. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  3. Python并发编程的几篇文章

    Python几种并发实现方案的性能比较 http://www.elias.cn/Python/PyConcurrency?from=Develop.PyConcurrency python并发编程 h ...

  4. Python并发编程之深入理解yield from语法(八)

    大家好,并发编程 进入第八篇. 直到上一篇,我们终于迎来了Python并发编程中,最高级.最重要.当然也是最难的知识点--协程. 当你看到这一篇的时候,请确保你对生成器的知识,有一定的了解.当然不了解 ...

  5. 自学Python之路-Python并发编程+数据库+前端

    自学Python之路-Python并发编程+数据库+前端 自学Python之路[第一回]:1.11.2 1.3

  6. Python并发编程二(多线程、协程、IO模型)

    1.python并发编程之多线程(理论) 1.1线程概念 在传统操作系统中,每个进程有一个地址空间,而且默认就有一个控制线程 线程顾名思义,就是一条流水线工作的过程(流水线的工作需要电源,电源就相当于 ...

  7. Python并发编程一(多进程)

    1.背景知识(进程.多道技术) 顾名思义,进程即正在执行的一个过程.进程是对正在运行程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一 ...

  8. 《转载》Python并发编程之线程池/进程池--concurrent.futures模块

    本文转载自Python并发编程之线程池/进程池--concurrent.futures模块 一.关于concurrent.futures模块 Python标准库为我们提供了threading和mult ...

  9. Python并发编程系列之多线程

    1 引言 上一篇博文详细总结了Python进程的用法,这一篇博文来所以说Python中线程的用法.实际上,程序的运行都是以线程为基本单位的,每一个进程中都至少有一个线程(主线程),线程又可以创建子线程 ...

随机推荐

  1. 分布式事物解决方案-TCC

    分布式框架下,如何保证事物一致性一直是一个热门话题.当然事物一致性解决方案有很多种(请参考:分布式事物一致性设计思路),我们今天主要介绍TCC方案解决的思路.以下是参与设计讨论的一种解决思路,大家有问 ...

  2. ConcurrentHashMap竟然也有死循环问题?

    前几天和朋友闲聊,说遇到了一个ConcurrentHashMap死循环问题,当时心里想这不科学呀?ConcurrentHashMap怎么还有死循环呢,毕竟它已经解决HashMap中rehash中死循环 ...

  3. EventBus原理解析

    前言 EventBus的核心思想是观察者模式 (生产/消费者编程模型) . SpringBoot+EventBus使用教程(一) SpringBoot+EventBus使用教程(二) 通过前面的文章我 ...

  4. 动手学深度学习4-线性回归的pytorch简洁实现

    导入同样导入之前的包或者模块 生成数据集 通过pytorch读取数据 定义模型 初始化模型 定义损失函数 定义优化算法 训练模型 小结 本节利用pytorch中的模块,生成一个更加简洁的代码来实现同样 ...

  5. CF 715 E. Complete the Permutations

    CF 715 E. Complete the Permutations 题目大意:给定两个排列\(p,q\)的一部分.定义两个排列\(p,q\)的距离为使用最少的交换次数使得\(p_i=q_i\).对 ...

  6. 论文阅读: Infrastructure-Based Calibration of a Multi-Camera Rig

    Abstract 在线标定很重要. 但是目前的方法都计算量都很高. 我们的方案不需要标定板之类的东西. 我们的方案不需要假设相机有重合的FOV,也不需要任何的初始猜测. 当相机模组行驶穿过之前建过地图 ...

  7. Android添加新按键

    1.前言 在Android开发中可能会遇到添加新的按键的需求,本文将简单介绍如何在Android系统中完成一个新的按键的添加. 当系统有新的按键需要添加时,Linux内核下的键码到Android系统中 ...

  8. .tar.gz 文件和 .tar.xz 文件的区别

    tar.gz and tar.xz both are compressed tar-files, but with different compression methods. tar.gz is c ...

  9. 宽字符与Unicode (c语言 汉语字符串长度)

    在C语言中,我们使用char来定义字符,占用一个字节,最多只能表示128个字符,也就是ASCII码中的字符.计算机起源于美国,char 可以表示所有的英文字符,在以英语为母语的国家完全没有问题. 但是 ...

  10. 理解 Virtual DOM(摘)及评价

    框架并没有提高web的性能,只是让开发者更加专注的完成业务逻辑,而不用过渡的考虑性能上的优化.如果以性能来比的话,框架是绝对比不过优化后的原生代码的. 二.什么是Virtual DOM Virtual ...