python入门学习篇二十九

死锁(哲学家吃面)

所谓死锁:是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,

# 单进程和单线程不能出现死锁现象

线程队列

# 在线程中使用队列
因为队列是
    管道 + 锁
所以用队列还是为了保证数据的安全

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('主')

 

搜索

复制

上一篇:【思维导图】零基础如何把握Python学习方向


下一篇:Python语法基础