一:进程

  • 进程概念

    • 进程就是一个程序运行在一个数据集上的一次动态执行过程
    • 进程一般由程序,数据集,进程控制块组成
    • 进程控制块: 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志(通俗讲就是记录进程状态信息)

二:线程

  • 线程概念

    • 一个程序至少有一个进程,一个进程至少有一个线程
    • 线程是进程的组成部分,线程是最小的执行单位
    • 进程相当于一个容器,是最小的资源单位
    • 线程共用进程的资源,线程是进程中的一个实体
    • 一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成
    • 一个线程可以创建和撤消另一个线程

一:线程的创建与调用(threading中Thread类)

  • 创建一个主线程的子线程对象

    • t1=threading.Thread(target=read)
    • target:指向函数,arg:传递函数参数
  • 启用一个子线程
    • t1.start()
    • 实际start()只是让线程处于就绪态,开始一个线程时run()方法实现的  
 1 import threading
2 import time
3 def read():
4 print("I am reading at %s"%time.ctime())
5 time.sleep(3)
6 print("i am finish reading at %s"%time.ctime())
7 def music():
8 print("i am listening music at %s"%time.ctime())
9 time.sleep(3)
10 print("i am finish listening music at %s"%time.ctime())
11 if __name__=="__main__":
12 t1=threading.Thread(target=read)#创建这个程序的主线程的子线程对象
13 #target:指向调用的函数,arg用于传递函数中的参数
14 t1.start()#启用某个线程
15 t2=threading.Thread(target=music)
16 t2.start()

线程执行的理解

1.首先t1,t2与主线程开启,直接输出
I am reading at Thu Jan 31 12:20:38 2019
I am listening music at Thu Jan 31 12:20:38 2019
Main threading ending at Thu Jan 31 12:20:38 2019... 2.俩个进程等待三秒钟
3.最后输出
I am finish listening music at Thu Jan 31 12:20:41 2019
I am finish reading at Thu Jan 31 12:20:41 2019

二:join的用法理解

 1 import threading
2 import time
3 def read():
4 print("I am reading at %s"%time.ctime(),end="\n")
5 time.sleep(3)
6 print("I am finish reading at %s"%time.ctime(),end="\n")
7 def music():
8 print("I am listening music at %s"%time.ctime())
9 time.sleep(5)
10 print("I am finish listening music at %s"%time.ctime(),end="\n")
11 if __name__=="__main__":
12 t1=threading.Thread(target=read)#创建这个程序的主线程的子线程对象
13 #target:指向调用的函数,arg用于传递函数中的参数
14 t2=threading.Thread(target=music)
15 t1.start() # 启用某个线程
16 t2.start()
17 #t1.join()
18 t2.join()
19 print(r"main threading ending at %s..."%time.ctime())

join用法的理解

  • 没有join时,主线程开子线程一起执行
  • 注释掉t2.join()          
      • 1.执行t1,t2子线程
        I am reading at Thu Jan 31 13:09:39 2019
        I am listening music at Thu Jan 31 13:09:39 2019
        2.进入等待3秒钟
        3.执行t1子线程和主线程
        I am finish reading at Thu Jan 31 13:09:42 2019
          main threading ending at Thu Jan 31 13:09:44 2019...
        4.进入等待俩秒钟
        5。执行t2
        I am finish listening music at Thu Jan 31 13:09:44 2019
  • 注释掉t1.join

      • 1.执行t1,t2子线程
        I am reading at Thu Jan 31 13:20:50 2019
        I am listening music at Thu Jan 31 13:20:50 2019
        2.进入等待5秒钟,单线程1只需等待三秒钟,所以在三秒钟时会继续执行ti线程
        I am finish reading at Thu Jan 31 13:20:53 2019
        3.在三秒钟后在过俩秒钟执行t2和主线程
        I am finish listening music at Thu Jan 31 13:23:28 2019
        main threading ending at Thu Jan 31 13:23:28 2019...       
  • 都不注释

      • 1.执行t1,t2子线程
        I am reading at Thu Jan 31 13:26:55 2019
        I am listening music at Thu Jan 31 13:26:55 2019
        2,进入等待5秒,在第三秒执行t1
        I am finish reading at Thu Jan 31 13:26:58 2019
        3.再过俩秒执行t2和主线程
        I am finish listening music at Thu Jan 31 13:27:00 2019
        main threading ending at Thu Jan 31 13:27:00 2019...

三:总结

  在没有join时,主线程会与子线程同时执行,但当子线程有了设置了join时,主线程会等待带有join的子线程执行完毕再结束,如果一个进程的join设置再另一个线程开始之前,后者会在前者执行完毕再执行,如果是x.start+x.join+x1.start+x1.join。。。这种格式就成了穿行

  • 守护线程的概念

    • 只要主线程完成了,不管守护子线程是否完成,都要和主线程一起退出,整个Python会在所有的非守护线程结束后才会结束,即进程中没有非守护线程存在的时候才结束

  • setDaemon方法实例理解
 import threading
import time
def read():
print("I am reading at %s"%time.ctime(),end="\n")
time.sleep()
print("I am finish reading at %s"%time.ctime(),end="\n")
def music():
print("I am listening music at %s"%time.ctime())
time.sleep()
print("I am finish listening music at %s"%time.ctime(),end="\n")
if __name__=="__main__":
t1=threading.Thread(target=read)
t2=threading.Thread(target=music)
t1.setDaemon(True)
t1.start()
t2.start()
print(r"main threading ending at %s..."%time.ctime())
一.设置t1为守护线程是看不到效果的,因为,主进程在所有非守护线程结束了才会结束
二:设置t2为守护线程
1.首先执行t1,t2和主线程
执行结果:
I am reading at Fri Feb 1 20:28:58 2019
I am listening music at Fri Feb 1 20:28:58 2019
main threading ending at Fri Feb 1 20:28:58 2019... 2.由于主线程会在所有非守护线程结束后才结束,所以非守护线程t1在3秒后结束,从而主线程结束,t2被迫
结束
执行结果:
I am finish reading at Fri Feb 1 20:29:01 2019
Process finished with exit code 0

# run():  线程被cpu调度后自动执行线程对象的run方法
# start():启动线程活动。
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。 threading模块提供的一些方法:
# threading.currentThread(): 返回当前的线程变量。
      #<_MainThread(MainThread, started 14428)>#输出的主线程名字MainThread
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
      #[<_MainThread(MainThread, started 13548)>, <Thread(Thread-1, started 10348)>, <Thread(Thread-2, started 18144)>]
      #从这里可以发现主线程实在所有线程结束后才结束
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。

最后补充一下线程的类调用方法 https://www.cnblogs.com/yuanchenqi/articles/6248025.html 

    

    

         

python第九天(9-33)的更多相关文章

  1. Python第九课学习

    Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...

  2. 《笨方法学Python》加分题33

    while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...

  3. python第九天----今天来晚了!

    作业 1. HAproxy配置文件操作1. 根据用户输入输出对应的backend下的server信息2. 可添加backend 和sever信息3. 可修改backend 和sever信息4. 可删除 ...

  4. Python第九章模块和包(2)

    1.如果文件下没有__init__.py文件,程序将不会认为这是一个Python的包. 2.如果要使用from 包  import  *  则需要 这样做. 是模块中包含 方法 的文件没有包含类: # ...

  5. Python第九章模块和包

    1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...

  6. Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作

    Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...

  7. 我的第一个python web开发框架(33)——接口代码重构

    前面ORM模块我们已经完成了开发,接下来要做的就是对项目代码进行重构了.因为对底层数据库操作模块(db_helper.py)进行了改造,之前项目的接口代码全都跑不起来了. 在写ORM模块时,我们已经对 ...

  8. python第九章:面向对象--小白博客

     面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...

  9. python全栈开发 * 33 知识点汇总 * 180718

    33 udp协议编码 显示客户端名字,输出带颜色的内容 udp协议的时间同步机制 #一.udp 协议编码 一个服务器,多个客户端#服务器:# import socket# sk=socket.sock ...

  10. python第九十六天 ---Django(1)

    django 模块 一  安装: pip3 install django 或 python -m pip install django 二  添加环境变量 相关命令: #cmd 下 django-ad ...

随机推荐

  1. json 百分比转化

    NumberFormat number = NumberFormat.getPercentInstance(); number.setMaximumFractionDigits(0);//设置小数点后 ...

  2. Python基础知识3-函数、参数及参数解构

    函数 函数定义.调用 函数参数 函数参数默认参数 函数参数默认值 可变参数 keyword-only参数 可变参数和参数默认值 函数参数 参数解构 练习: #编写一个函数,能够接受至少2个参数 def ...

  3. 【XSY2903】B 莫比乌斯反演

    题目描述 有一个\(n\times n\)的网格,除了左下角的格子外每个格子的中心里都有一个圆,每个圆的半径为\(R\),问你在左下角的格子的中心能看到多少个圆. \(n\leq {10}^9,R_0 ...

  4. 使用Sublime Text 3进行Markdown编辑+实时预览

    使用Sublime Text 3进行Markdown编辑+实时预览 安装软件包管理器 打开Sublime Text 3 同时按下 ctrl+` ,窗口底部出现一个小控制台 复制以下代码,粘贴到控制台的 ...

  5. react-native命令行打包APK报错

    我是根据react-native官网进行的react-native打包APK 我的步骤为 第一步就是生成密钥 第二步就是将密钥拷入 第三步:在\android\gradle.properties写入 ...

  6. LVM备份(3)- pg_dumpall

  7. MTD下的Nand驱动

    目录 MTD下的Nand驱动 引入 平台设备资源文件 关键数据结构 平台框架 s3c24xx_nand_probe nand_scan s3c2410_nand_add_partition add_m ...

  8. JavaScript数据类型 Boolean布尔类型

    前言 布尔值Boolean类型可能是三种包装对象Number.String和Boolean中最简单的一种.Number和String对象拥有大量的实例属性和方法,Boolean却很少.从某种意义上说, ...

  9. [物理学与PDEs]第2章第5节 一维流体力学方程组的 Lagrange 形式 5.2 Lagrange 坐标

    1. Lagrange 坐标 $$\beex \bea &\quad 0=\int_\Omega\cfrac{\p \rho}{\p t}+\cfrac{\p}{\p x}(\rho u)\r ...

  10. SSH框架之hibernate《三》

    Hibernate03     一.多表设计         1.1多表设计的总则             问题:我们为什么要学习多表映射?             答:                ...