死锁(哲学家吃面)
所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象, # 单进程和单线程不能出现死锁现象
线程队列
# 在线程中使用队列 因为队列是 管道 + 锁 所以用队列还是为了保证数据的安全 import queue '''先进先出''' # q=queue.Queue() # 线程队列 # q.put('first') # q.put('second') # q.put('third') # # print(q.get()) # print(q.get()) # print(q.get()) ''' 结果(先进先出): first second third ''' import queue # last in first out # q=queue.LifoQueue() # q.put('first') # q.put('second') # q.put('third') # # print(q.get()) # print(q.get()) # print(q.get()) q=queue.PriorityQueue() #put进入一个元组,元组的第一个元素是优先级(通常是数字,也可以是非数字之间的比较),数字越小优先级越高 q.put((20,'a')) q.put((10,'b')) q.put((30,'c')) print(q.get()) print(q.get()) print(q.get())
进程池和线程池
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor from multiprocessing import Process def task(n, m): return n + m def task1(n, m): return n + m # 回调函数 def callback(res): print(res) print(res.result()) def callback1(res): print(res) print(res.result()) if __name__ == '__main__': # 启一个进程池,里面启了5个进程 p_pool = ProcessPoolExecutor(5) # p = Process(target=task) # p.start() p_pool.submit(task, n=1, m=2).add_done_callback(callback) p_pool.submit(task1, n=2, m=2).add_done_callback(callback1) p_pool.shutdown() # 就相当于join ''' 回调函数: ''' # 告诉进程池里面的进程回调哪个函数? print('主进程')
协程
协程:是单线程下的并发, 本质是来回切换,而协程对于操作系统来说,压根不存在,在操作系统里面没有协程这个概念,在操作系统中,只有进程和线程,而协程是程序员级别的,因此,它也被称为是用户态轻量级线程, # 开销比较 开进程 >>>> 开线程 >>>> 开协程 总结协程特点: ''' 1. 必须在只有一个单线程里实现并发 2. 修改共享数据不需加锁 3. 附加:一个协程遇到IO操作自动切换到其它协程(如何实现检测IO,yield、greenlet都无法实现,就用到了gevent模块(select机制)) ''' import gevent import time # 猴子补丁 from gevent import monkey monkey.patch_all() def monkey_patch_json(): json.__name__ = 'ujson' json.dumps = ujson.dumps json.loads = ujson.loads monkey_patch_json() def eat(name): print('%s eat 1' %name) # gevent.sleep(2) time.sleep(2) print('%s eat 2' %name) def play(name): print('%s play 1' %name) # gevent.sleep(1) time.sleep(1) print('%s play 2' %name) g1=gevent.spawn(eat,'lqz') g2=gevent.spawn(play,name='lqz') g1.join() g2.join() #或者gevent.joinall([g1,g2]) print('主')
搜索
复制