一:进程
-
进程概念
- 进程就是一个程序运行在一个数据集上的一次动态执行过程
- 进程一般由程序,数据集,进程控制块组成
- 进程控制块: 进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志(通俗讲就是记录进程状态信息)
二:线程
- 线程概念
一:线程的创建与调用(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)的更多相关文章
-
Python第九课学习
Python第九课学习 数据结构: 深浅拷贝 集合set 函数: 概念 创建 参数 return 定义域 www.cnblogs.com/yuanchenqi/articles/5782764.htm ...
-
《笨方法学Python》加分题33
while-leep 和我们接触过的 for-loop 类似,它们都会判断一个布尔表达式的真伪.也和 for 循环一样我们需要注意缩进,后续的练习会偏重这方面的练习.不同点在于 while 循环在执行 ...
-
python第九天----今天来晚了!
作业 1. HAproxy配置文件操作1. 根据用户输入输出对应的backend下的server信息2. 可添加backend 和sever信息3. 可修改backend 和sever信息4. 可删除 ...
-
Python第九章模块和包(2)
1.如果文件下没有__init__.py文件,程序将不会认为这是一个Python的包. 2.如果要使用from 包 import * 则需要 这样做. 是模块中包含 方法 的文件没有包含类: # ...
-
Python第九章模块和包
1.import Python文件的时候文件名不能跟Python中自带的关键字重复,否则无法使用关键字的方法. 2.Reload(),重载例子 import sysreload(sys)sys.set ...
-
Python 第九篇:队列Queue、生产者消费者模型、(IO/异步IP/Select/Poll/Epool)、Mysql操作
Mysql操作: grant select,insert,update,delete on *.* to root@"%" Identified by "123456&q ...
-
我的第一个python web开发框架(33)——接口代码重构
前面ORM模块我们已经完成了开发,接下来要做的就是对项目代码进行重构了.因为对底层数据库操作模块(db_helper.py)进行了改造,之前项目的接口代码全都跑不起来了. 在写ORM模块时,我们已经对 ...
-
python第九章:面向对象--小白博客
面向对象介绍 一.面向对象和面向过程 面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点 ...
-
python全栈开发 * 33 知识点汇总 * 180718
33 udp协议编码 显示客户端名字,输出带颜色的内容 udp协议的时间同步机制 #一.udp 协议编码 一个服务器,多个客户端#服务器:# import socket# sk=socket.sock ...
-
python第九十六天 ---Django(1)
django 模块 一 安装: pip3 install django 或 python -m pip install django 二 添加环境变量 相关命令: #cmd 下 django-ad ...
随机推荐
-
AnguarJS 第二天----数据绑定
Terms 今天学习AngularJS双向数据绑定的特性,这里面需要提到两个概念: 数据模型:数据模型是指 $scope对象, $scope对象是简单的javascript对象,视图可以访问其中的属性 ...
-
关于PHP函数time() date() 和 strtotime() 的时区问题
最近项目中有个需求, 要记录新注册用户的次日登录情况, 于是写出了如下代码: $create_time = '用户注册时间'; //格式 Y-m-d H:i:s $time = time(); $la ...
-
java servlet Json.org.jar
servlet我们可以把他当成一个数据媒介,他最终执行的是将方法体内获取处理后的数据,返回给请求的客户端,或以XML格式,或以JSON格式 ,我这里是使用的JSON格式数据,所以下面我要说org.js ...
-
自己封装的一个java图片验证码
验证码生成器: package com.lz.Tools; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...
-
Python中的Class的讨论
尽管Python在Function Programming中有着其他语言难以企及的的优势,但是我们也不要忘了Python也是一门OO语言哦.因此我们关注Python在FP上的优势的同时,还得了解一下P ...
-
NBUT1457 Sona 莫队算法
由于10^9很大,所以先离散化一下,把给你的这一段数哈希 时间复杂度O(nlogn) 然后就是分块莫队 已知[L,R],由于事先的离散化,可以在O(1)的的时间更新[l+1,r],[l,r+1],[l ...
-
iOS中Block介绍(二)内存管理与其他特性
我们在前一章介绍了block的用法,而正确使用block必须要求正确理解block的内存管理问题.这一章,我们只陈述结果而不追寻原因,我们将在下一章深入其原因. 一.block放在哪里 我们针对不同情 ...
-
Java多线程基础——线程间通信
在使用多线程的时候,经常需要多个线程进行协作来完成一件事情.在前面两章分析了Java多线程的基本使用以及利用synchronized来实现多个线程同步调用方法或者执行代码块.但上面两章的内容涉及到的例 ...
-
[Angularjs]$http.post与$.post
摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下. 一个例子 这里模拟登录的一个场 ...
-
css 修改input中placeholder提示问题颜色
input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: rgba(74, 87, 103, 1); ...