• 线程、进程和协成对比


    讲述线程、进程和协成?

    1)为什么引入:

    操作系统可以同时运行多个任务,引入了线程,进程和协成

    2)定义:

    线程: 可以理解成执行代码的分支,线程是执行对应的代码的,cpu会调度对应的线程去工作,也可以说线程是cpu调度的基本单位(工作原理)
    进程: 通俗理解一个运行起来的程序或者软件叫做进程
    如何理解进程:把进程想成现实生活中的公司,公司可以给员工提供办公资源(办公桌椅,办公电脑等资源), 真正干活的是员工,所以员工可以想成线程,公司就是进程

    协成:又称为微线程,也称为用户级线程,在不开辟线程的基础上完成多任务,在def里面只看到一个yield关键字可以理解程是协程(理解), 在单线程的基础上可以完成多任务,多个任务按照一定顺序交替执行(目的)

    3)使用:

    进程、线程和协成的使用对比
    2.1 线程是cpu调度的基本单位,通过线程去执行进程中代码, 线程是执行代码的分支
    2.2 进程是操作系统资源分配的基本单位,每启动一个进程都需要向操作系统索要运行资源,默认一个进程只有一个线程,线程是依附在进程里面的
    2.3 多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大
    2.4 多进程开发某个进程死了不会影响其它进程的运行,但是多线程开发该进程死了那么这些线程都要进行销毁
    2.5 进程之间不共享全局变量,线程之间共享全局变量,但是线程要注意资源竞争的问题
    线程之间共享全局变量:
    同步就是协同步调,按预定的先后次序进行运行线程同步可以解决共享全局变量的问题
    从而引入了互斥锁,互斥锁确保了某段关键代码只能由一个线程从头到尾完整地执行,在使用过程中要避免出现死锁
    进程之间不共享全局变量:
    多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类
    2.6 先有进程,然后进程可以创建线程,线程是依附在进程里面的,线程里面可以包含多个协程
    2.7 多线程开发线程之间执行是无序的,协程之间执行按照一定顺序交替执行
    2.8 协程以后主要用在网络爬虫和网络请求,开辟一个协程大概需要5k空间,开辟一个线程需要512k空间, 开辟一个进程占用资源最多

    附录:

    对于线程的使用
    1.线程之间执行是无序(对比中已包含)

    2.主线程会等待所有的子线程执行完成以后程序再退出,daemon=True 表示守护主线程,主线程退出子线程直接销毁不再执行对应的代码

    3.多线程共享全局变量(对比中已包含)
    4.互斥锁: 能保证同一时刻只有一个线程去执行代码,具体那个线程抢到锁我们决定不了,但是加上互斥锁多任务瞬间变成单任务变成单任务性能会下降(对比中已包含)

    5.死锁:一直等待对方释放锁的情景就叫做死锁,工作中避免死锁的出现,要在适当的地方释放锁(对比中已包含)

    对于进程的使用:
    1.多进程之间不共享全局变量,为了进程间的通讯,引入Queue这个类(对比中已包含)

    2.向队列里面放入数据统一put方法,获取数据的使用同一使用get方法

    3.主进程会等待所有的子进程执行完成以后程序再退出,设置守护主进程,主进程退出后子进程直接销毁 sub_process.daemon = True
    主进程退出之前先让子进程直接销毁,然后主进程就可以退出了:sub_process.terminate()

    通过进程池完成对应的任务
    同步执行:一个任务执行完成另外一个任务才能执行 pool.apply(copy_work) 资源竞争时使用
    使用异步方式用进程池执行对应的任务:pool.apply_async(copy_work)

    5.创建进程池中的queue时,使用异步执行对应的任务,执行异步任务会返回一个应用结果对象,这个对象里面有一个wait()方法可以等待异步任务执行完成以后代码再继续往下执行

    对于协成的使用:
    gevent封装是greenlet,可以根据耗时操作自动完成协程之间的切换执行

    打补丁,让gevent框架识别耗时操作,比如:time.sleep,网络请求延时,monkey.patch_all()

    创建协程指定对应的任务
    *args: 以位置方式传参
    **kwargs: 以关键字方式传参
    g1 = gevent.spawn(download_img, img_url1, “1.jpg”)

    主线程等待所有的协程执行完成以后程序再退出
    gevent.joinall([g1, g2, g3])

    更多见:https://blog.csdn.net/sinat_41912529/article/details/80306582

  • 相关阅读:
    ural 1818 Fair Fishermen
    2013ACM-ICPC杭州赛区全国邀请赛总结
    成为程序界的叶问,你需要打败这十个人
    在互联网时代,你是消费者还是创造者?
    别让好想法埋没:如何进行APP开发?
    从无到有:学习程序开发的四个步骤
    BAT三家互联网公司哪家更注重用户体验?
    Stack Overflow大揭密:哪一种程序员工资最高?
    web产品浏览器兼容性问题你有考虑到吗?
    响应式网页设计:互联网web产品RWD概念
  • 原文地址:https://www.cnblogs.com/Dark-fire-liehuo/p/10061721.html
Copyright © 2020-2023  润新知