• Python进程、线程、协成


    什么是线程?
    程序执行的最小单位
    线程是进程中的一个实体,是被系统独立调度和分派的基本单位

    线程的创建
    threading.Thread(target = 变量名)

    线程的资源竞争问题
    线程是可以资源共享的同时也会存在问题就是资源竞争
    为了防止这种问题的出现,就提出了锁的概念

    互斥锁
    某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;
    直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源

    #threading 模块中定义了 Lock 类,可以方便的处理锁定:
    # 创建锁
    mutex = threading.Lock()
    # 锁定
    mutex.acquire()
    # 释放
    mutex.release()

    锁里的内容越少越好

    锁的好处:
    确保了某段关键代码只能由一个线程从头到尾完整地执行
    锁的坏处:
    阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,效率就大大地下
    降了。
    由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成
    死锁。

    死锁
    在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资
    源,就会造成死锁

    什么是进程?
    进程是程序的一次执行
    进程是可以和别的计算并行执行
    进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位

    进程的创建
    multiprocessing.Process(target=变量名)

    进程间不同享全局变量
    这个时候就出现了Queue
    可以使用 multiprocessing 模块的 Queue 实现多进程之间的数据传递,Queue 本身是一个消
    息列队程序。put() 放入元素,get()取出元素

    #返回当前队列包含的消息数量;
    Queue.qsize()
    #如果队列为空,返回 True,反之 False ;
    Queue.empty()
    #如果队列满了,返回 True,反之 False;
    Queue.full()
    #获取队列中的一条消息,然后将其从列队中移除,block 默认
    Queue.get([block[, timeout]])


    进程池 Pool
    手动的去创建进程的工作量巨大,此时就可以用到
    multiprocessing 模块提供的 Pool 方法。
    初始化 Pool 时,可以指定一个最大进程数,当有新的请求提交到 Pool 中时,如果池还没有
    满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大
    值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

    po = Pool(3) # 定义一个进程池,最大进程数 3
    for i in range(0,10):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))
    print("----start----")
    po.close() # 关闭进程池,关闭后 po 不再接收新的请求
    po.join() # 等待 po 中所有子进程执行完成,必须放在 close 语句之后
    print("-----end-----")

    什么是协程?
    协程是一种用户态的轻量级线程
    协程的调度完全由用户控制
    协程拥有自己的寄存器和栈

    网上抓取图片实例:

    import urllib.request
    import gevent
    from gevent import monkey


    def download(img_name,img_url):

    req = urllib.request.urlopen(img_url)

    img_content = req.read()

    with open(img_name, "wb") as f:
    f.write(img_content)

    def main():

    gevent.joinall([

    gevent.spawn(download,"3.png","https://rpic.douyucdn.cn/live-cover/appCovers/2018/10/18/5051688_20181018115702_small.jpg "),
    gevent.spawn(download,"4.png","https://rpic.douyucdn.cn/live-cover/appCovers/2018/11/20/4902933_20181120204919_small.jpg")

    ]
    )

    if __name__ == '__main__':
    main()


    进程、线程和协程的区别?

    一个程序至少有一个进程,一个进程至少有一个线程.
    线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
    进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程
    序的运行效率
    线程不能够独立执行,必须依存在进程中
    一个线程可以多个协程,一个进程也可以单独拥有多个协程
    .线程进程都是同步机制,协程是异步.线程进程都是同步机制,协程是异步


    来源:CSDN
    原文:https://blog.csdn.net/qq_43454410/article/details/84581623

  • 相关阅读:
    MYsql 之单标查询.
    MYSQL社区版安装手册
    爬虫框架学习
    celery_消息队列
    rabbitMQ消息队列
    Django分页设置
    Mysql-基础+安装指南
    super函数的用法
    hashlib 和loggin模块
    Python的魔法方法
  • 原文地址:https://www.cnblogs.com/jian-gao/p/10695859.html
Copyright © 2020-2023  润新知