守护进线程,互斥锁,信号量,队列,死锁递归锁等
来源:互联网 发布:mac系统格式化u盘 编辑:程序博客网 时间:2024/06/05 15:37
守护进程:
from multiprocessing import Processimport os,time,randomdef task(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) # p = Process(target=time.sleep, args=(3,)) # p.start()if __name__ == '__main__': p=Process(target=task) p.daemon = True #1、必须在p.start()之前 2:守护进程不能开启子进程 p.start() # p.join() print('主') ''' 举例说明守护进程的应用场景: 假设有两个任务要干,要玩出并发的效果,使用进程的话可以让主进程 执行一个任务,然后开启一个子进程执行一个任务。 如果这两个任务毫无关系,那么就像上面这么做就可以 如果主进程的任务在执行完毕后,子进程的任务没有存在的意义了 那么该子进程应该在开启之前就被设置成守护进程 '''
迷惑人的例子
主进程代码运行完毕,守护进程就会结束
from multiprocessing import Processfrom threading import Threadimport timedef foo(): print(123) time.sleep(1) print("end123")def bar(): print(456) time.sleep(3) print("end456")if __name__ == '__main__': p1=Process(target=foo) p2 = Process(target=bar) p1.daemon=True p1.start() p2.start() print("main-------") #打印该行则主进程代码结束,则守护进程p1应该被终止,可能会有p1任务执行的打印信息123,因为主进程打印main----时,p1也执行了,但是随即被终止互斥锁三个例子:
from multiprocessing import Process,Lockimport os,time,random # 互斥锁就是给整串行,比join好点,可以控制锁的时间。def task(mutex): mutex.acquire() print('%s print 1'%os.getpid()) time.sleep(random.randint(1,2)) print('%s print 2' % os.getpid()) time.sleep(random.randint(1, 2)) print('%s print 3' % os.getpid()) time.sleep(random.randint(1, 2)) mutex.release()if __name__ == '__main__': mutex = Lock() p1 = Process(target=task,args=(mutex,)) p2 = Process(target=task,args=(mutex,)) p3 = Process(target=task,args=(mutex,)) p1.start() p2.start() p3.start()##########################################################from multiprocessing import Process,Lockimport os,time,random,jsondef search(): with open('db.txt',encoding='utf-8') as f: dic=json.load(f) print('%s 剩余票数 %s'%(os.getpid(),dic['count']))def get(): with open('db.txt',encoding='utf-8') as read_f: dic = json.load(read_f) if dic['count'] > 0: dic['count'] -= 1 time.sleep(random.randint(1,3)) with open('db.txt','w',encoding='utf-8')as write_f: json.dump(dic,write_f) print('%s 抢票成功'%os.getpid())def task(mutex): search() mutex.acquire() get() mutex.release()if __name__ == '__main__': mutex = Lock() for i in range(20): p = Process(target=task,args=(mutex,)) p.start()########################################################from threading import Thread,Lockimport timen = 100def task(mutex): global n with mutex: ### 相当于 那 两行代码 temp = n time.sleep(0.01) n = temp-1if __name__ == '__main__': mutex = Lock() t_l = [] for i in range(100): t = Thread(target=task,args=(mutex,))### t = Thread(target=task) # 因为是线程资源共享,所以不用传参args=(mutex,) t_l.append(t) t.start() for i in t_l: i.join() print(n) ############ 0
信号量:
from multiprocessing import Process,Semaphore# from threading import Thread,Semaphoreimport time,random,osdef task(sm): with sm: print('%s 上厕所' %os.getpid()) time.sleep(random.randint(1,3))if __name__ == '__main__': sm=Semaphore(3) for i in range(10): p=Process(target=task,args=(sm,)) p.start()==============================================================================================================================
ipc机制 : 进程之间通信,指的是用内存空间共享,来实现进程之间通信:
①管道
②队列
frommultiprocessingimportQueue#进程队列
q=Queue(3) 若 定义为3,则放3个拿3个,超出则进程结束不了,一直等着。q.put({'a':1})q.put('xxxxx')q.put(3)q.put(4)print(q.get())print(q.get())print(q.get())print(q.get())
importqueue#线程队列
队列:先进先出
q=queue.Queue(3)q.put({'a':1})q.put('xxxxx')q.put(3)q.put(4)print(q.get())print(q.get())print(q.get())print(q.get())优先级队列:数字越小优先级越高
q=queue.PriorityQueue(3)q.put((10,{'a':1}))q.put((-1,'xxxxx'))q.put((0,3))# q.put(4)print(q.get())print(q.get())print(q.get())print(q.get())
堆栈:先进后出
q=queue.LifoQueue(3)q.put({'a':1})q.put('xxxxx')q.put(3)# q.put(4)print(q.get())print(q.get())print(q.get())print(q.get())
死锁/递归锁
from threading import Thread,Lock,RLock # RLock 就是说可以多次拿锁。import time# mutexA=mutexB=Lock()mutexA=mutexB=RLock() ###两个锁的时候会出现死锁,一个拿到锁却没释放class MyThread(Thread): def run(self): self.f1() self.f2() def f1(self): mutexA.acquire() print('%s 拿到A锁' %self.name) mutexB.acquire() print('%s 拿到B锁' %self.name) mutexB.release() mutexA.release() def f2(self): mutexB.acquire() print('%s 拿到B锁' % self.name) time.sleep(0.1) mutexA.acquire() print('%s 拿到A锁' % self.name) mutexA.release() mutexB.release()if __name__ == '__main__': for i in range(10): t=MyThread() t.start()
终身美丽 --- 郑秀文
阅读全文
0 0
- 守护进线程,互斥锁,信号量,队列,死锁递归锁等
- python并发编程之多线程2------------死锁与递归锁,信号量等
- 互斥锁、死锁、递归锁、信号量、Event
- 线程/GIL/线程锁/信号量/守护进程/Event事件/queue队列/生产者消费者模型
- Python3之多线程GIL、同步锁、信号量、死锁与递归锁、线程Queue、Event、定时器
- sleep yield,守护线程,释放锁,死锁例子volatile
- Linux中线程同步:互斥锁/信号量/条件变量+无锁队列
- 多线程--线程同步、死锁、守护线程、多线程下载
- 线程、线程信号量等常用函数小结
- 线程同步:原子操作、锁、二元信号量、信号量、互斥量、临界区、读写锁、条件变量等
- 信号量和线程互斥锁
- 线程互斥锁与死锁
- 线程互斥锁与死锁
- 同步线程锁 死锁
- Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁
- Java--线程--线程控制,线程安全,线程同步,线程等待,线程交互,死锁,互斥锁,读写锁
- 信号量/等待队列、 自旋锁
- 基于Boost的数据处理器及线程安全队列、跨平台的信号量和互斥锁
- css/jquery 笑脸评价
- angular.foreach 的使用方法
- 微信浏览器调起相机拍照并显示图片
- form表单序列化转json(后台接收json转object)
- Python.装饰器
- 守护进线程,互斥锁,信号量,队列,死锁递归锁等
- 限制input输入类型(多种方法实现)
- unity-xcode 预编译
- Java技巧: 根据网址查询DNS/IP地址
- 2017年11月编程语言排行榜
- 蓝桥杯 动态数组的使用
- VUE(二)
- valgrind的编译和使用
- php处理json格式数据经典案例总结