# -*- coding: utf-8 -*- """ 多进程 锁使用 逻辑: 10个进程各种睡眠2秒,然后打印. 不加锁同时打印出来,总共2秒,加锁一个接一个打印,总共20秒 总结: 1.Lock 只要1把锁,RLock 有多把锁,但是不清楚什么场景只适合用RLock 使用: 1. 创建所 lock = Lock() or lock = RLock() 2. 把锁当做参数传入给子进程 3. 在子进程执行代码中对代码块,加锁 lock.acquire(); 其他代码 lock…
# -*- coding: utf-8 -*- """ 多进程数据共享 管道Pipe 逻辑: 2个进程,各自发送数据到管道,对方从管道中取到数据 总结: 1.只适合两个进程 2.recv 会阻塞 3.其中一个进程结束了,管道还在,另外一个进程还能使用 4.可以把管道认为一个队列, 发送数据端,往队列写数据 接收数据端,从队列读数据,队列空了阻塞 单向管道 1个队列,双向管道 2个队列 使用: 1. 创建2个管道的两端的对象 pipe_left_conn,pipe_right_…
# -*- coding: utf-8 -*- """ 多进程数据共享 服务器进程 multiprocessing.Manager 入门使用 逻辑: 20个子线程修改共享数据 总结: 1. Mangeer类似 Value,Array 2. 里面内容比较多,这只是入门用法 3. 还可以操作共享自定义对象,本例是基本数据结构 简单使用: 1. 创建多进程管理的 基本数据结构 list1 = manager.list([1,2,3,4,5]) dict1 = manager.dic…
1. Code # -*- coding: utf-8 -*- """ 多进程 数据共享 共享变量 Value,Array 逻辑: 2个进程,对同一份数据,一个做加法,一个做加法,各做10次 总结: 1.入口代码 必须放在 if __name__ == '__main__' 下,不然报错,不清楚为什么 用法: 1. 创建共享变量 o = Value('i',1000) or o = Array('i',list) 指定不同的类型 2. 启动子进程通过 o.value or o…
# -*- coding: utf-8 -*- """ 多进程 同步 事件multiprocessing.Event 逻辑: 子线程负责打印,会阻塞, 等待主进程发出控制信号 以便继续 总结: 个人理解, multiprocessing.Event 中维护了一个boolean变量,初始值为Fasle e.wait() 如果为Fasle会阻塞,True继续执行 , set() 将值设置为True clear() 将值设置为False is_set() 查看 不确定是否支持多个子…
# -*- coding: utf-8 -*- """ 多进程同步 使用信号量 multiprocessing.Semaphore 逻辑: 启动5个进程,打印,每个各自睡眠2秒 竞争2个锁大小的信号量,任何时候只有2个进程在执行打印 总结: 1.通过信号 实现了Pool的效果,任何时候最多只有2个进程在执行指定代码段 2.相当于创建了锁的数组,一次创建多把锁,绑定同一个名字 3.与RLock 有细微区别 RLock 同一个进程可以锁多次 Semaphore 多个不同进程可以同…
1  队列读写 # -*- coding: utf-8 -*- """ 多进程 共享 队列 multiprocessing.Process 逻辑: 一个进程往队列写数据,一个进程从读写读数据 写进程完了后,主进程强行结束读进程 使用: 1. 创建队列 q = multiprocessing.Queue() ,默认无限大小,可以指定大小 2. 把队列 q 当参数传给 子进程 执行代码, 猜测应该不能通过全局变量的方式访问 3. 在子进程中读写队列数据 q.put(<dat…
前言 关于吃火锅的场景,小伙伴并不陌生,吃火锅的时候a同学往锅里下鱼丸,b同学同时去吃掉鱼丸,有可能会导致吃到生的鱼丸. 为了避免这种情况,在下鱼丸的过程中,先锁定操作,让吃火锅的小伙伴停一会,等鱼丸熟了再开吃,那么python如何模拟这种场景呢? 未锁定 1.如果多个线程同时操作某个数据,会出现不可预料的结果.比如以下场景:当小伙伴a在往火锅里面添加鱼丸的时候,小伙伴b在同时吃掉鱼丸,这很有可能导致刚下锅的鱼丸被夹出来了(没有熟),或者还没下锅,就去夹鱼丸(夹不到). # coding=utf…
我想大家都知道python的gil限制,记得刚玩python那会,知道了有pypy和Cpython这样的解释器,当时听说是很猛,也就意味肯定是突破了gil的限制,最后经过多方面测试才知道,还是那德行…. 如果你的应用英语那种cpu密集运算的,p大部分情况都推荐使用多进程. 有些扯远了,我个人很喜欢用gevent这种协程的框架,但是不是所有的模块都可以这种用户态的线程… 不得已会用threading… 常用的模块一般都附带线程安全的问题.. 但是如果你自己的扩展模块,有时候会遇到线程安全,也就是线…
摘要:在使用多线程的应用下,如何保证线程安全,以及线程之间的同步,或者访问共享变量等问题是十分棘手的问题,也是使用多线程下面临的问题,如果处理不好,会带来较严重的后果,使用python多线程中提供LockRlockSemaphoreEventCondition用来保证线程之间的同步,后者保证访问共享变量的互斥问题Lock&;RLock:互斥锁用来保证多线程访问共享变量的问题Semaphore对象:Lock互斥锁的加强版,可以被多个线程同时拥有,而Lock只能被某一个线程同时 在使用多线程的应用下…