ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python入门学习篇二十九

2022-02-27 18:34:28  阅读:180  来源: 互联网

标签:协程 入门 get python put 二十九 gevent print name


死锁(哲学家吃面)

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

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

线程队列

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

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

 

搜索

复制

标签:协程,入门,get,python,put,二十九,gevent,print,name
来源: https://www.cnblogs.com/zhangrukai/p/15942981.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有