python的进程与线程(二)
线程
之前了解了操作系统的发展史,也知道了进程和线程的概念,归纳一下就是:
进程:本质上就是一段程序的运行过程(抽象的概念)
线程:最小的执行单元,是进程的实体
线程的调用
在python中,一般通过导入threading模块来调用线程。 threading 模块建立在thread 模块之上。thread模块以低级、原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装,提供了更方便的api来处理线程,先看一段直接调用的代码:
直接调用:
# -*- coding: utf-8 -*-
import threading,time def func1(n):
print('传给我的是%s'%n)
time.sleep(3) def func2():
print('我没有参数的')
time.sleep(5) if __name__ == '__main__':
t1 = threading.Thread(target=func1,args=(5,)) #target传入的是函数名,不带括号,args要以元组形式传入参数
t2 = threading.Thread(target=func2) #没有参数就不用传 t1.start() #运行线程,本质是调用run方法
t2.start()
print('ending......') >>>传给我的是5
>>>我没有参数的
>>>ending......
运行的时候几乎同时打印了三条结果,然后等待约5s再停止,如果是单线程的话就要8s的时间才能运行完,这样做提升了效率。其次这个程序一共有多少线程呢?答案是3个,除了t1和t2两个实例化得到的子线程,还有程序本身的主线程,还记得那句话吗?一个程序至少有一个进程,一个进程至少有一个线程。
继承方式调用线程:
import time
import threading class Mythread(threading.Thread):
def __init__(self,n):
threading.Thread.__init__(self)
self.n = n def func1(self):
print('传给我的是%s'%self.n)
time.sleep(self.n) def run(self): ##定义每个线程要运行的函数
self.func1() if __name__ == '__main__':
t1 = Mythread(2)
t2 = Mythread(5) t1.start()
t2.start() >>>传给我的是2
>>>传给我的是5
也是直接打印两条结果,然后等待5s程序结束。一般这种方式很少用到,都是直接调用比较快。如果不穿参数的话,__init__方法可以不用写,但是run函数一定要写的,至于为什么,你可以通过找继承的父类去推,这里就不啰嗦了。
线程的join方法
join是线程实例化后也具有的方法,像上边的start一样,那么join有什么作用呢?
import threading
from time import ctime,sleep def music(name): print ("Begin listening to %s. %s" %(name,ctime()))
sleep(2)
print("end listening %s"%ctime()) def moive(title): print ("Begin recording the %s! %s" %(title,ctime()))
sleep(5)
print('end recording %s'%ctime()) threads = [] t1 = threading.Thread(target=ListenMusic,args=('毛不易的歌',))
t2 = threading.Thread(target=RecordBlog,args=('白蛇',)) threads.append(t1)
threads.append(t2) if __name__ == '__main__': for t in threads:
t.start()
#t.join()#串行
# t.join() # t1.join() # t2.join()########分别试一下这几种join位置下的结果
print('endtime is %s'%ctime())
我们逐个分析,不加join时:
Begin listening to 毛不易的歌. Thu Apr 11 17:47:01 2019
Begin recording the 白蛇! Thu Apr 11 17:47:01 2019
endtime is Thu Apr 11 17:47:01 2019
end listening Thu Apr 11 17:47:04 2019
end recording Thu Apr 11 17:47:06 2019
加上一个t1.join时:
Begin listening to 毛不易的歌. Thu Apr 11 17:49:42 2019
Begin recording the 白蛇! Thu Apr 11 17:49:42 2019
end listening Thu Apr 11 17:49:45 2019
endtime is Thu Apr 11 17:49:45 2019
end recording Thu Apr 11 17:49:47 2019
注意endtime的变化,然后去试试其他情况就可以知道(注意for循环里面和外面的t的区别),join作用就是在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
线程的setDaemon方法
通过join我们可以阻塞线程,那么setDaemon就刚好相反,就是将线程声明为守护线程,但是必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦
import threading
from time import ctime,sleep def music(name): print ("Begin listening to %s. %s" %(name,ctime()))
sleep(2)
print("end listening %s"%ctime()) def moive(title): print ("Begin recording the %s! %s" %(title,ctime()))
sleep(5)
print('end recording %s'%ctime()) threads = [] t1 = threading.Thread(target=ListenMusic,args=('毛不易的歌',))
t2 = threading.Thread(target=RecordBlog,args=('白蛇',)) threads.append(t1)
threads.append(t2) if __name__ == '__main__':
#t1.setDaemon(True)
t2.setDaemon(True)
for t in threads:
#t.setDaemon(True) #一定要在start前
t.start()
#t.join()#串行
# t.join() t1.join() # t2.join()########分别试一下这几种join位置下的结果
print('endtime is %s'%ctime())
看一下结果,白蛇没看完就停了
Begin listening to 毛不易的歌. Thu Apr 11 18:03:42 2019
Begin recording the 白蛇! Thu Apr 11 18:03:42 2019
end listening Thu Apr 11 18:03:45 2019
endtime is Thu Apr 11 18:03:45 2019
其他方法
# run(): 线程被cpu调度后自动执行线程对象的run方法
# start():启动线程活动。
# isAlive(): 返回线程是否活动的。
# getName(): 返回线程名。
# setName(): 设置线程名。 threading模块提供的一些方法:
# threading.currentThread(): 返回当前的线程变量。
# threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
# threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
基本的线程就是这样使用的,后面讲的就是同步和异步的概念,还有各种锁,慢慢来。
python的进程与线程(二)的更多相关文章
- Python创建进程、线程的两种方式
代码创建进程和线程的两种方式 """ 定心丸:Python创建进程和线程的方式基本都是一致的,包括其中的调用方法等,学会一个 另一个自然也就会了. "" ...
- Python的进程与线程--思维导图
Python的进程与线程--思维导图
- python之进程与线程
什么是操作系统 可能很多人都会说,我们平时装的windows7 windows10都是操作系统,没错,他们都是操作系统.还有没有其他的? 想想我们使用的手机,Google公司的Androi ...
- 《Python》进程收尾线程初识
一.数据共享 from multiprocessing import Manager 把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机 ...
- Python的进程、线程和threading模块
(注:本文部分内容摘自互联网,由于作者水平有限,不足之处,还望留言指正.) 怀念在学校念书的时候,我不小心触碰到了错误,老师会说:你错了:而我却总是倔强得以为自己没错.我的内心是不屑的,直到在真理面前 ...
- Python基础-进程和线程
一.进程和线程的概念 首先,引出“多任务”的概念:多任务处理是指用户可以在同一时间内运行多个应用程序,每个应用程序被称作一个任务.Linux.windows就是支持多任务的操作系统,比起单任务系统它的 ...
- python的进程与线程
一.进程与线程的相关概念 1.什么是进程 进程是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序,数据集,进程控制块三部分组成. 2.什么是线程 线程也叫轻量级进程,它是一个基本的CPU执行 ...
- Python之进程、线程、协程
进程和线程的目的 进程和线程目的是为了:提高执行效率 现代操作系统比如Mac OS X,UNIX,Linux,Windows等,都是支持“多任务”的操作系统. 什么叫“多任务“呢?简单地说,就是操作系 ...
- python并发编程之线程(二):死锁和递归锁&信号量&定时器&线程queue&事件evevt
一 死锁现象与递归锁 进程也有死锁与递归锁,在进程那里忘记说了,放到这里一切说了额 所谓死锁: 是指两个或两个以上的进程或线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将 ...
随机推荐
- titanium环境配置
###### **工具:** > * [titanium studio](http://www.appcelerator.com/product/) > * [node.js](https ...
- Andoird 自定义ViewGroup实现竖向引导界面
转载请表明出处:http://write.blog.csdn.net/postedit/23692439 一般进入APP都有欢迎界面,基本都是水平滚动的,今天和大家分享一个垂直滚动的例子. 先来看看效 ...
- java.util.ConcurrentModificationException异常的解决
问题复现: List<String> list = new ArrayList<>();list.add("11");list.add("55&q ...
- nsqlookup_protocol_v1.go
, atomic.LoadInt64(&client.peerInfo.lastUpdate)) now := time.Now() p.ctx.nsqlook ...
- golang 并发模式笔记
1.并发并不是并行,前者是优先对时间片的抢占,后者是真多核. go中多线程时直接要求并行的方法是: 亦不可滥用,CPU密集型,并发度很高的场景适用. 2.go起的协程 3. function that ...
- docker+mysql+zabix-server环境搭建
本次使用docker搭建zabbix的组合是mysql+docker+zabix-server 测试环境为:1.操作系统版本为:centos7.5 2.docker版本为:1.13.1 3 mysql ...
- i春秋------Misc更新
今天早上起来很开森!因为今天要打比赛了(2018年3月安恒杯线上赛),等到比赛开始得时候,发现自己登陆不上去 想了很久发现自己只是预约了比赛,并没有报名(QAQ ),心疼一下傻傻的自己.现在开始工作: ...
- SpringBoot(二)_项目属性配置
修改端口 在main/resources/application.properties修改端口 server.port=8088 此时启动访问localhost:8088/hello 就会看到 Hel ...
- 二维码神器QRCoder
好久没有写Blog,都是因为不小心坠入了爱河,时间都给我家那位了,都没时间加班了(嗨呀,不小心撒了一下狗粮),不过,还是希望单身的赶紧找到心仪的另一半,实在找不到,那就加班啊(开个玩笑,别认真). 二 ...
- 国际知名CSS Reset 总结
NO.01 CSS Tools: Reset CSS 网站:https://meyerweb.com/eric/tools/css/reset/ 优点:老牌,用的人多. /* http://mey ...