一、昨日内容回顾

   1. 概念和理论

      进程是计算机资源分配最小单位

      进程三状态、同步、异步、阻塞、非阻塞

   2. 进程的创建

      实例化、自建类run,start,join,terminate,daemon等

   3.进程的同步控制

       Lock:互斥锁

      Semaphore:锁+计数器

      Event:事件

   4.进程间的通信

      队列Queue:put、get、empty、full、put_nowait、get_nowait 管道+锁

        进程之间的数据安全--进程安全

        可以是任意数据类型

      管道Pipe:

        有两端,双向通信

        需要关闭掉不用的所有端口,才会在recv处报错

        进程不安全

5.数据共享 Manager:dict,list

       # 进程都在同一台计算机上使用

      # 数据在进程之间不安全

      目前常用的进程之间的数据共享:消息中间件

        #memcache

        #rabbitmq

        #redis

6.进程池Pool

      #什么情况下用进程池:

        # 高cpu型的代码需要用进程池

        #进程池cpu个数+1

      # Pool池

        apply同步

        apply_async 异步提交

          #get 获取返回值

          #close

          #join

        map

          # apply_async的简化版,它内部实现了close和join方法

          #但是没有get方法,无法接受返回值

        回调函数:apply_async(callback=???)

          # 回调函数实在主进程中执行的

7,信号量和进程池的区别,信号量的用处

        #在同一时刻只会有n个进程在执行某段代码

        #不同:

          #信号量是有多少任务开启多少进程,信号量仍然给操作系统带来了很多负担。

          # 池中进程的数量是固定的,只是分别借用池中的进程来执行任务而已

信号量的用处(同一target函数中,高IO部分用多进程,高CPU部分用信号量计算,这样节省进程切换等开销):

        

二、线程

    1. 线程的概念和特点

为什么有进程还要开启线程:

    

    线程是计算机中能被cpu调度的最小单位:

多线程的特点:并发的、轻量级、数据不隔离

     多进程的特点:并发的、操作笨重、数据隔离

2.线程的开启

        

import json
import time,os
from threading import Thread def func():
for i in range(10):
time.sleep(0.5)
print('Thread:', i,os.getpid()) if __name__ == '__main__':
t = Thread(target=func)
t.start()
time.sleep(1)
print('in main 1',os.getpid())
time.sleep(1)
print('in main 2',os.getpid())

主线程和子线程在同一进程

    3.效率测试

 

from multiprocessing import Process
from threading import Thread
import time def func(num):
print(num**num) if __name__ == '__main__':
p_lst = []
start = time.time()
for i in range(50):
p = Process(target=func, args=(i,))
p.start()
p_lst.append(p)
for i in p_lst:
i.join()
print('======', time.time()-start) t_lst = []
start = time.time()
for i in range(50):
t = Thread(target=func, args=(i,))
t.start()
t_lst.append(p)
for i in t_lst:
i.join()
print('********', time.time()-start)

对于高计算任务,多线程高出多进程几个数量级

    4.数据隔离性测试

from threading import Thread

n =100

def func():
global n
n -= 1 t = Thread(target=func)
t.start()
t.join()
print(n)

数据隔离,线程共享进程资源

    5.子线程和主线程

from threading import Thread,currentThread
import time def func():
time.sleep(1)
print('子进程', currentThread()) t = Thread(target=func)
t.start()
print('主进程', currentThread()) # 主线程结束意味着主进程结束,主线程会等着子线程结束才结束

主线程结束意味着主进程结束,主线程会等着子线程结束才结束

      6.全局解释器锁GIL

      

python全栈开发day34-线程Thread的更多相关文章

  1. python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)

    昨日内容回顾 线程什么是线程?线程是cpu调度的最小单位进程是资源分配的最小单位 进程和线程是什么关系? 线程是在进程中的 一个执行单位 多进程 本质上开启的这个进程里就有一个线程 多线程 单纯的在当 ...

  2. Python全栈开发:线程代码实例

    #进程与线程的关系 """ 多进程(主进程,子进程): 优点:能同时利用多个CPU,进行多个操作,提高效率. 缺点:耗费内存资源(进程要开辟内存空间),进程不是越多越好, ...

  3. Python全栈开发:线程、进程和协程

    Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env pytho ...

  4. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

  5. Python全栈开发【模块】

    Python全栈开发[模块] 本节内容: 模块介绍 time random os sys json & picle shelve XML hashlib ConfigParser loggin ...

  6. python全栈开发目录

    python全栈开发目录 Linux系列 python基础 前端~HTML~CSS~JavaScript~JQuery~Vue web框架们~Django~Flask~Tornado 数据库们~MyS ...

  7. Python 全栈开发【第0篇】:目录

    Python 全栈开发[第0篇]:目录   第一阶段:Python 开发入门 Python 全栈开发[第一篇]:计算机原理&Linux系统入门 Python 全栈开发[第二篇]:Python基 ...

  8. Python全栈开发【面向对象进阶】

    Python全栈开发[面向对象进阶] 本节内容: isinstance(obj,cls)和issubclass(sub,super) 反射 __setattr__,__delattr__,__geta ...

  9. Python全栈开发【面向对象】

    Python全栈开发[面向对象] 本节内容: 三大编程范式 面向对象设计与面向对象编程 类和对象 静态属性.类方法.静态方法 类组合 继承 多态 封装 三大编程范式 三大编程范式: 1.面向过程编程 ...

随机推荐

  1. <algorithm>里的sort函数对结构体排序

    题目描述 每天第一个到机房的人要把门打开,最后一个离开的人要把门关好.现有一堆杂乱的机房签到.签离记录,请根据记录找出当天开门和关门的人. 输入描述: 每天的记录在第一行给出记录的条目数M (M &g ...

  2. C#中使用Application.AddMessageFilter(this)要手动释放

    如题,要使用Application.RemoveMessageFilter(this);释放,如果不释放会造成很严重的内存泄漏.

  3. WEB 服务器 加速缓存比较

    Nginx 相对 Apache httpd 的优点: - 轻量级,同样起web 服务,比apache 占用更少的内存及资源 - 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的 ...

  4. CSS进阶之模拟Bootstrap网格布局

    目前暂时实现效果,容后面整理心得,先贴上源代码. 源码 <!DOCTYPE html> <html> <head> <title>demo bootst ...

  5. Java类的5个加载步骤

    类加载的五个过程分为: 加载 验证 准备 解析 初始化 1 加载 完成三件事: 通过类的全限定名来获取定义此类的二进制字节流 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 在内存中生成 ...

  6. 在css中控制图像的大小

    可在CSS中利用width属性和height属性控制一个图像得到大小,就像控制其他任何盒子的大小一样. <html> <head> <title>TODO supp ...

  7. JS浮点数运算Bug的解决办法

    方法一:重写浮点运算的函数 //除法函数,用来得到精确的除法结果 //说明:javascript的除法结果会有误差,在两个浮点数相除的时候会比较明显.这个函数返回较为精确的除法结果. //调用:acc ...

  8. 一步一步详解ID3和C4.5的C++实现

    1. 关于ID3和C4.5的原理介绍这里不赘述,网上到处都是,可以下载讲义c9641_c001.pdf或者参考李航的<统计学习方法>. 2. 数据与数据处理 本文采用下面的训练数据: 数据 ...

  9. 记一次Win Server 2012部署问题及解决方法

    1.前言 本章内容为在win server 2012服务器部署时遇到的问题及解决方法.大致工作为:两台服务器,一台web.一台数据库:web服务器部署.net web程序,数据库服务器安装oracle ...

  10. CentOS配置SSH无密码

    210-211/212/213的集群中,新增215节点,操作:1.将210的id_rsa.pub拷贝到215中:scp ~/.ssh/id_rsa.pub 192.168.0.215@host:/ho ...