一:进程

  • 进程概念

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

二:线程

  • 线程概念

    • 一个程序至少有一个进程,一个进程至少有一个线程
    • 线程是进程的组成部分,线程是最小的执行单位
    • 进程相当于一个容器,是最小的资源单位
    • 线程共用进程的资源,线程是进程中的一个实体
    • 一个标准的线程由线程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. 记录一下各个用过 IDE 以及 其他工具 的实用快捷键(持续更新)

    通用: win10锁屏:win + L win10查看服务:win+R,输入services.msc即可 Shift + Tab:多行缩进 Shift + Space:切换输入法 全/半角 Shift ...

  2. Python——列表、元祖、字典 操作方法

    一.编码方式占位 1.ASCII码:字母.数字.特殊字符,1个字节占8位 2.Unicode:字母 2字节占16位  /  中文 4字节 占32位 3.UTF8:字母 1字节占8位 / 欧洲 2字节占 ...

  3. Python——Flask框架——电子邮件

    一.框架(Flask-Mail) 安装 : pip install flask-mail 二.SMTP服务器的配置 配置 默认值 说明 MAIL_SERVER locallhost 电子邮件服务器的主 ...

  4. luogu2597-[ZJOI2012]灾难 && DAG支配树

    Description P2597 [ZJOI2012]灾难 - 洛谷 | 计算机科学教育新生态 Solution 根据题意建图, 新建一个 \(S\) 点, 连向每个没有入边的点. 定义每个点 \( ...

  5. [问题]Android listView item edittext 不能调用软键盘输入法

    android listview item edittext not  softkeyboard edittext可以获取焦点, 可以触发事件, 但是就是不能调用输入法, 不知道为什么? 难道不能在i ...

  6. Vim和Neovim安装YouCompleteMe

    确定支持Python,Vim一般支持,Neovim默认不支持 Vim的就不介绍方法了,很多系统都不一样.Neovim添加Python支持 pip install setuptools pip inst ...

  7. Cucumber常用关键字

    常用关键字(中英文对应) 对应的测试用例 Feature(功能) test suite (测试用例集) background(背景)   Scenario(场景) test case(测试用例) Sc ...

  8. Windows启动过程(MBR引导过程分析)

    catalogue . 电脑启动过程 . MBR分析(master boot record) - 位于整个硬盘的 扇区 . DBR(DOS boot record) - 位于柱面0,磁头1,扇区1,即 ...

  9. Windows 环境下的 protoc 安装(转)

    如果是为了编译hadoop2.8.0源码,必须使用2.5.0版本的protobuf,安装方法同下 1. 下载需要的安装包:https://github.com/google/protobuf/rele ...

  10. 金融量化分析【day112】:股票数据分析Tushare1

    目录 1.使用tushare包获取某股票的历史行情数据 2.输出该股票所有收盘比开盘上涨3%以上的日期 3.输出该股票所有开盘比前日收盘跌幅超过2%的日期 4.假如我从2010年1月1日开始,每月第一 ...