Python3使用线程
Python2标准库中提供了两个模块thread和threading支持多线程。
thread有一些缺陷在Python3中弃用,为了兼容性,python3 将 thread 重命名为 "_thread",在Python3中推荐直接使用threading。
创建线程对象
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
参数说明:
group 应该为 None;为了日后扩展 ThreadGroup 类实现而保留。
target 是用于 run() 方法调用的可调用对象。默认是 None,表示不需要调用任何方法。
name 是线程名称。默认情况下,由 "Thread-N" 格式构成一个唯一的名称,其中 N 是小的十进制数。
args 是用于调用目标函数的参数元组。默认是 ()。
kwargs 是用于调用目标函数的关键字参数字典。默认是 {}。
如果 daemon 不是 None,线程将被显式的设置为 守护模式,不管该线程是否是守护模式。如果是 None (默认值),线程将继承当前线程的守护模式属性。
线程对象其中的几个方法
start()开始线程活动。
run() 代表线程活动的方法。
join(timeout=None) 等待,直到线程终结
setDaemon()设置是否为守护线程
一、使用线程有两种方式:函数或者用类来包装线程对象
例子1:使用函数
import random
import threading
import time def run(threadName):
for i in range(5):
time.sleep(random.random())
#这里只是演示参数,获取当前线程名可用threading.currentThread().getName()
print('{} : {}'.format(threadName, i)) t1 = threading.Thread(target=run, args=('thread 1',))
t1.start()
t2 = threading.Thread(target=run, args=('thread 2',))
t2.start() '''
运行结果:
thread 2 : 0
thread 2 : 1
thread 1 : 0
thread 1 : 1
thread 2 : 2
thread 2 : 3
thread 1 : 2
thread 1 : 3
thread 2 : 4
thread 1 : 4
'''
例子2:使用类(运行结果和例子1类似)
import random
import threading
import time class test(threading.Thread):
def __init__(self,name):
super().__init__()
self.name = name
def run(self):
for i in range(5):
time.sleep(random.random())
print('{} : {}'.format(self.name, i)) t1 = test('thread 1')
t1.start()
t2 = test('thread 2')
t2.start()
二、join(timeout=None) 方法
一个进程启动之后,会默认产生一个主线程A,当创建子线程B后,如果不调用B.join(),则主线程A和子线程B会同时执行;
如果调用B.join()则主线程会在调用处等待子线程B执行完后,才继续往下执行。
参数timeout是可选的,代表线程运行的最大时间,如果超过这个时间,不管这个线程有没有执行完毕都会被回收,然后主线程会接着执行。
join在start后才调用。
1、不调用子线程join方法
import random
import threading
import time def run():
name = threading.currentThread().getName()
print('{} start'.format(name))
time.sleep(random.random())
print('{} end'.format(name)) threads = []
for i in range(5):
threads.append(threading.Thread(target=run)) for th in threads:
th.start() print("finished") '''
运行结果
Thread-1 start
Thread-2 start
Thread-3 start
Thread-4 start
Thread-5 startfinished Thread-5 end
Thread-3 end
Thread-2 end
Thread-4 end
Thread-1 end
'''
2、调用子线程join方法
import random
import threading
import time def run():
name = threading.currentThread().getName()
print('{} start'.format(name))
time.sleep(random.random())
print('{} end'.format(name)) threads = []
for i in range(5):
threads.append(threading.Thread(target=run)) for th in threads:
th.start() #等待,直到线程终结。
for th in threads:
th.join() print("finished") '''
运行结果
Thread-1 start
Thread-2 start
Thread-3 start
Thread-4 start
Thread-5 start
Thread-3 end
Thread-5 end
Thread-4 end
Thread-1 end
Thread-2 end
finished
'''
三、setDaemon()方法
主线程A中创建子线程B后,如果调用B.setDaemon(),把子线程设置为守护线程。
表示主线程A一旦执行结束,不管子线程B是否执行完成,会全部被终止。
setDaemon和join相反,在start之前设置。
备注:
主线程在其它非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将会被回收,而进程必须保证非守护线程都运行完毕后才能结束。
所以如果存在多个子线程,假设有守护线程B,又有非守护线程C,则主线程会等待非守护线程C执行完,守护线程B如果还没执行完则会被终止。
import threading
import time def run():
name = threading.currentThread().getName()
print('{} start'.format(name))
time.sleep(2)
#下面这行代码因为主线程已经执行结束,被终止执行
print('{} end'.format(name)) print("start") t = threading.Thread(target=run)
t.setDaemon(True)
t.start() time.sleep(1) print("finished") '''
运行结果
start
Thread-1 start
finished
'''
四、线程锁
每个线程互相独立,相互之间没有任何关系,但是在同一个进程中的资源,线程是共享的,如果不进行资源的合理分配,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。
下面例子,如果不用线程锁Lock,则每次得到的结果都不一样。
from threading import Thread, Lock
lock = Lock()
total = 0 #如果不使用lock那么,最后得到的数字不一定为0;
def cal(type):
global total
for i in range(1000000):
lock.acquire()
if(type == '+'):
total += 1
else:
total -= 1
lock.release() thread1 = Thread(target=cal,args=('+',))
thread2 = Thread(target=cal,args=('-',))
thread1.start()
thread2.start()
thread1.join()
thread2.join() print(total)
Python3使用线程的更多相关文章
- python3之线程与进程
1.CPU运行原理 我们都知道CPU的根本任务就是执行指令,对计算机来说最终都是一串由“0”和“1”组成的序列.CPU从逻辑上可以划分成3个模块,分别是控制单元.运算单元和存储单元,这三部分由CPU内 ...
- Python3 进程 线程 同步锁 线程死锁和递归锁
进程是最小的资源单位,线程是最小的执行单位 一.进程 进程:就是一个程序在一个数据集上的一次动态执行过程. 进程由三部分组成: 1.程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成 2.数据 ...
- python3之线程(一)
线程的概念 现在的操作系统几乎都支持运行多个任务,而在操作系统内部,一个任务往往代表的执行的某一个程序,也就是运行中的程序,运行的程序是一个动态的概念,也就是所说的进程,而在进程内部,往往有许多顺序执 ...
- python3线程启动与停止
转自: https://blog.csdn.net/weixin_38125866/article/details/76795462 https://www.cnblogs.com/lcchuguo/ ...
- 洗礼灵魂,修炼python(87)-- 知识拾遗篇 —— 线程(1)
线程(上) 1.线程含义:一段指令集,也就是一个执行某个程序的代码.不管你执行的是什么,代码量少与多,都会重新翻译为一段指令集.可以理解为轻量级进程 比如,ipconfig,或者, python ...
- python3之协程
1.协程的概念 协程,又称微线程,纤程.英文名Coroutine. 线程是系统级别的它们由操作系统调度,而协程则是程序级别的由程序根据需要自己调度.在一个线程中会有很多函数,我们把这些函数称为子程序, ...
- Python 3 线程模型,进程模型记录
最近需要使用 python3 多线程处理大型数据,顺道探究了一下,python3 的线程模型的情况,下面进行简要记录: 多线程运行的优点: 使用线程可以把程序中占用时间较长的任务放到后台去处理: 用户 ...
- Python之路PythonThread,第四篇,进程4
python3 进程/线程4 进程间同步互斥方法: from multiprocessing import Lock 创建 进程锁对象 lock = Lock() lock.acquire() 给 ...
- Python3 与 C# 并发编程之~ 线程篇
2.线程篇¶ 在线预览:https://github.lesschina.com/python/base/concurrency/3.并发编程-线程篇.html 示例代码:https://gith ...
随机推荐
- Python爬虫,你是否真的了解它?
程序员有时候很难和外行人讲明白自己的工作是什么,甚至有些时候,跟同行的人讲清楚“你是干什么的”也很困难.比如我自己,就对Daivd在搞的语义网一头雾水.所以我打算写一篇博客,讲一下“爬虫工程师”的工作 ...
- 爬虫爬取m3u8视频文件
一.m3u8视频格式 一般m3u8文件和 视频流ts文件放在同一目录 而m3u8文件格式存放的一般都是ts 文件的一个列表 二.根据m3u8视频存放以及写法的规律 思路 我们一般网站上能找到的m3u8 ...
- js闭包理解案例-解决for循环为元素注册事件的问题
转发自http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html 一.变量的作用域 要理解闭包,首 ...
- Python小练习:StringIO和BytesIO读写操作的小思考
from io import StringIO; f = StringIO(); f.write('Hello World'); s = f.readline(); print s; 上面这种方法&q ...
- flutter 打包apk
打包的具体操作,可以参照官网,只是官网没有那么细 1.修改AndroidManifest.xml 2.构建配置 可以跳过 3.构建签名 4.创建 key.properties 5.配置混淆 6.修改 ...
- Python复习 一
Python回炉复习 1 变量 Python的变量和C语言的变量书写方式类似: 书写要求 python程序编写结构利用缩进表示,抛弃花括号: 结构 分支: if(条件语句1): 执行语句块 else ...
- Thymeleaf对象的使用:字符串对象
Thymeleaf主要使用 org.thymeleaf.expression.Strings 类处理字符串,在模板中使用 #strings 对象来处理字符串. 开发环境:IntelliJ IDEA 2 ...
- sqlserver查看表空间
sqlserver 用于查看当前数据库所有表占用空间大小的存储过程 create procedure dbo.proc_getsize as begin create table #temp ( t_ ...
- 通过官网模板轻松实现Grafana的可视化界面配置(以MySQL监控项为例)
我们知道可视化是监控的一个重要环节,所以往往我们这个环节花费大量的时间和精力.可是如果可以借鉴前辈的经验和成果,可以事半功倍.Grafana 有着非常漂亮的图表和布局展示,功能齐全的度量仪表盘和图形编 ...
- IOR and mdtest - measure parallel file system I/O performance at both the POSIX and MPI-IO level.
This parallel program performs writes and reads to/from files under several sets of conditions and r ...