python全栈开发day35-线程

1.线程

  1)、什么是线程

    线程是cpu调度的最小单位

    线程是进程的必要组成单位

      一个进程里至少含有一个线程

  2)、主线程

     程序开始运行的视乎,就产生了一个主线程来运行这个程序

  3)、子线程

    是由主线程开启的其他线程

  4)、各线程之间的工作

    异步的

    数据共享的

  5)、GIL Cpython全局解释器锁

    Cpython解释器,在同一个进程中的多个线程,每次只能有一个线程可以获得执行CPU的权限。

    这是由于Cpython的垃圾回收线程等原因导致

2.线程的开启

3.守护线程

  # 守护线程,会等待主线程执行完毕才结束,主线程会等待所有子线程结束而结束。

4.锁

  区别GIL和锁,GIL只是同进程中的不同线程只能有一个线程访问CPU,而互斥锁,是保障数据安全的一种机制,二者不冲突。

5.死锁和递归锁

  互斥锁和递归锁的区别:

    #互斥锁在同一个线程中连续acquire一次以上就会死锁

    #递归锁在同一个线程中可以连续的acquire多次而不发生死锁

  #普遍:递归锁可以代替互斥锁来解决死锁现象

  #实际上:递归锁的解决死锁实际上是牺牲了时间和空间的

    # 死锁从本质上来说是一种逻辑错误

    # 递归锁没有从根本上解决死锁问题

  递归锁画图描述:

  

6.事件

7.定时器

8.条件

      

9.队列

10.池

  multiprocessing中的Pool:

    # apply_async 异步提交任务

    # 必须close join之后才能维护主进程和进程池之间的同步

    # map自带close、join效果

    # 获取执行结果get

    # 回调函数 指定callback参数,由主进程执行

       concurrent.futures.ThreadPoolExecutor/concurrent.futures.ProcessPoolExecutor

    # submit 异步提交任务

    # 使用shutdown来维护主进程和进程池之间的同步

    # map是不自带shutdown

    # 获取执行结果用result

    # 回调函数 直接调用add_done_callback方法,由子线程/子进程执行

  # 用concurrent.futures,可以轻松的在进程和线程之间切换(代码改个名字即可)

  #并发程序,线程池进程池都要用,只需要导入一个模块

  # concurrent.futures模块是一个新的模块,同意了线程池和进程池的使用方式,对一些操作进行了更合理的规划。

猜你喜欢

转载自www.cnblogs.com/wuchenggong/p/9198963.html
今日推荐