Day9 进程同步锁 进程队列 进程池 生产消费模型

进程同步锁:

当运行程序的时候,有可能你的程序同时开多个进程,开进程的时候会将多个执行结果打印出来,这样的话打印的信息都是错乱的,怎么保证打印信息是有序的呢?

其实也就是相当于让进程独享资源。

 1 from multiprocessing import Process,Lock    #引用函数
 2 import time
 3 def work(name,mutex):
 4     mutex.acquire()    #在这里加入锁
 5     print(‘task <%s> is runing‘ %name)
 6     time.sleep(2)
 7     print(‘task <%s> is done‘ % name)
 8     mutex.release()    #加完锁以后必须需要解锁
 9
10 if __name__ == ‘__main__‘:
11     mutex=Lock()
12     p1=Process(target=work,args=(‘egon‘,mutex))
13     p2=Process(target=work,args=(‘alex‘,mutex))
14     p1.start()
15     p2.start()
16     print(‘主‘)

比如说模拟抢票的功能:

要先写一个文本   ("count":1)   就记个数就行

 1 import json
 2 import os
 3 import time
 4 from multiprocessing import Process,Lock
 5 def search():
 6     dic=json.load(open(‘db.txt‘))
 7     print(‘\033[32m[%s] 看到剩余票数<%s>\033[0m‘ %(os.getpid(),dic[‘count‘]))
 8 def get_ticket():
 9     dic = json.load(open(‘db.txt‘))
10     time.sleep(0.5) #模拟读数据库的网络延迟
11     if dic[‘count‘] > 0:
12         dic[‘count‘]-=1
13         time.sleep(0.5)  # 模拟写数据库的网络延迟
14         json.dump(dic,open(‘db.txt‘,‘w‘))
15         print(‘\033[31m%s 购票成功\033[0m‘ %os.getpid())
16 def task(mutex):
17     search()
18     mutex.acquire()
19     get_ticket()
20     mutex.release()
21 if __name__ == ‘__main__‘:
22     mutex=Lock()
23     for i in range(10):
24         p=Process(target=task,args=(mutex,))
25         p.start()

进程队列:

共享内存的方式:

 1 from multiprocessing import Process,Manager,Lock     #Manager共享内存函数
 2
 3 def task(dic,mutex):
 4     with mutex:
 5         dic[‘count‘]-=1
 6
 7 if __name__ == ‘__main__‘:
 8     mutex=Lock()
 9     m=Manager()
10     dic=m.dict({‘count‘:100})
11     p_l=[]
12     for i in range(100):
13         p=Process(target=task,args=(dic,mutex))
14         p_l.append(p)
15         p.start()
16
17     for p in p_l:
18         p.join()
19     print(dic)

队列:

进程彼此之间隔离,要实现进程间通信

 1 from multiprocessing import Queue    #引用函数
 2 q=Queue(3)      #意味着你队列长队最大为三
 3
 4 q.put(‘first‘)
 5 q.put(‘second‘)
 6 q.put(‘third‘)
 7 # q.put(‘fourth‘)    #满了的话会一直卡住
 8
 9 print(q.get())
10 print(q.get())
11 print(q.get())
12 print(q.get())
13
14 #了解
15 # q=Queue(3)
16 #
17 # q.put(‘first‘,block=False)
18 # q.put(‘second‘,block=False)
19 # q.put(‘third‘,block=False)    #这样的话队列满了就会抛出异常,不会卡在这里
20 # # q.put_nowait(‘fourth‘) 21 #q.put(‘fourth‘,block=False)
22 # q.put(‘fourth‘,timeout=3)     #指定抛出时间,如果3秒后队列还是满的抛出异常

生产者消费者模型:

时间: 2024-10-29 19:05:34

Day9 进程同步锁 进程队列 进程池 生产消费模型的相关文章

Java生产消费模型—ArrayBlockingQueue详解

背景需求 生产消费模型是线程协作关系中十分常见的一种.通常,一个(多个)线程负责生产,一个(多个)线程可以从生产的列表中获取并消费:生产的内容可以按需求设计,可以是一个Integer,可以是String,可以Object,也可以是任意类型的对象,只要有生产消费的需求. 例如,厨师负责生产美食,放在桌子上,服务员负责取走(消费)美食.这里,厨师就扮演着生产者的身份,美食是生产的内容,服务员就扮演着消费者的身份. 下面用这个厨师与服务员的案例来分析下生产消费模型需要实现哪些功能才能满足需求: 如何实

【JAVA】wait和notify用法,附生产/消费模型

关于wait和notify的用法,网上已经有很多详细解释了,我只是简单的总结下. wait用于释放锁A,并让wait所在的线程阻塞.除非被持有锁A的其它线程执行notify来唤醒,它才能重新"活"过来. notify用于唤醒因为等待锁A而阻塞的线程,让它们做好竞争锁A的准备.如果有多个线程因等待锁A而被阻塞,notify只唤醒一个,唤醒所有用notifyAll. 参考下面的线程状态图,对理解wait和notify有很大的帮助. 总结: wait和notify通常和synchronize

python学习笔记-Day11 (线程、进程、queue队列、生产消费模型、携程)

线程使用 ###方式一 import threading def f1(arg): print(arg) t = threading.Thread(target=f1, args=(123,)) t.start() # start会调用run方法执行 # t是threading.Thread类的一个对象 # t.start()就会以线程的方式执行函数,可以使用pycharm ctrl选择start方法 # 找到Thread类的start方法,在start方法的注释中就已经写明,会去调用run()

Python学习之路并发编程--信号量、事件、队列及生产消费模型

1. 信号量 对于多进程来说,多个进程同时修改数据,就可能出现安全隐患,所以引入了锁,这一机制,但锁只能有一把来控制一个的开关,当你需要几把锁的时候,就可能用到信号量的概念.他是用了锁的原理,内置了一个计数器,在同一时内,只能有指定数量的进程来执行某一段被控制的代码. import time,random from multiprocessing import Process,Semaphore def singing(i,sem): ''' :param i: 随机生成20个数的值 :para

并发编程: 生产消费模型、死锁与Rlock、线程、守护线程、信号量、锁

一.守护进程 二.互斥锁 三.抢票 四.进程间通讯 五.进程间通讯2 一.守护进程 """ 进程间通讯的另一种方式 使用queue queue 队列 队列的特点: 先进的先出 后进后出 就像扶梯 """ from multiprocessing import Process,Queue # 基础操作 必须要掌握的 # 创建一个队列 # q = Queue() # # 存入数据 # q.put("hello") # q.put(

队列、生产消费模型.html

一.python 队列: 概述: import queue 都是在python内存中创建,python进程退出,则队列清空 可通过pycharm查看这些队列类的方法 先进先出队列: q = queun.Queue( [10] ) # 创建一个 "先进先出" 队列,最多接受10个数据,放第11个时会卡主,不加参数默认为0,即无限多个 q.qsize() # 查看当前队列中元素个数 q.maxsize # 队列最大个数 q.put(33, [ timeout=2] ) # 等待2秒,若2秒

生成器函数以及生产消费模型

1.生成器函数,即最终的输出用yield替代return,其他形式不变的函数,而且相比于return,输入yield函数不会立即停止 1 def test(): 2 print('你好') 3 return 10 4 def test_1(): 5 print('你好') 6 yield 10 7 a = test() 8 print(a) 9 b = test_1() 10 print(b) #<generator object test_1 at 0x00000000024F3570> 首

11.python并发入门(part11 进程同步锁,以及进程池,以及callback的概念)

一.关于进程锁. 其实关于进程锁没啥好讲的了,作用跟线程的互斥锁(又叫全局锁也叫同步锁)作用几乎是一样的. 都是用来给公共资源上锁,进行数据保护的. 当一个进程想去操作一个公共资源,它就可以给公共资源进程"上锁"的操作,其他进程如果也想去访问或者操作这个公共资源,那么其他的进程只能阻塞,等待刚刚的进程把锁释放,下一个进程才可以对这个公共资源进行操作. 下面是个关于进程锁的使用示范: #!/usr/local/bin/python2.7 # -*- coding:utf-8 -*- im

python GIL锁 锁 线程池 生产者消费模型

python的GIL 锁 python内置的一个全局解释器锁 , 锁的作用就是保证同一时刻一个进程中只有一个线程可以被cpu调度 为什么有这把GIL锁? python语言的创始人在开发这门语言时 , 目的快速把语言开发出来 , 如果加上GIL锁(C语言加锁) , 切换时按照100条字节指令来进行线程间的切换 锁 : 1.锁 : Lock(1次放1个) 线程安全 , 多线程操作时 , 内部会让所有线程排队处理 , 如 : list / dict / Queue 线程不安全 + 人  =>排队处理