python之线程相关操作
1.线程: 一个进程可以有多个线程,共享一个进程的资源;
2.进程线程的区别:
进程是资源分配的最小单位,线程是程序执行的最小单位
3.python中线程模块threading, 提供的类: Thread, Lock, Rlock, Semaphore, Event, 等等
4.线程的创建方式
# 第一种
# from threading import Thread
# def f1(s):
# print('我是%s' % s)
# def f2(s):
# print('我是%s' % s)
#
# if __name__ == '__main__':
# t = Thread(target=f1, args=(1,))
# t1 = Thread(target=f1, args=(2,))
# t.start()
# t1.start()
# print('我是主线程') # 第二种
from threading import Thread class MyThread(Thread):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print('%s今天还是不能皮' % self.name)
if __name__ == '__main__':
t = MyThread('Jerry')
t.start()
print('主线程')
6.查看线程的进程id(同进程查看方式一样)
import os
from threading import Thread
def f1(n):
print('1号', os.getpid())
print('%s号线程任务' % n)
def f2(n):
print('2号', os.getpid())
print('%s号线程任务' % n)
if __name__ == '__main__':
t1 = Thread(target=f1, args=(1,))
t2 = Thread(target=f2, args=(2,))
t1.start()
t2.start()
print('主线程', os.getpid())
print('主线程')
7. 在进程之间数据是空间隔离的, 而在线程中是数据共享的
import time
from threading import Thread # 通过对全局变量的修改来验证线程之间是数据共享的, 共享同一进程中的数据
num = 100
def f1():
time.sleep(3)
global num
num = 3
print('子线程的num', num) if __name__ == '__main__':
t = Thread(target=f1)
t.start()
t.join() # 等待子线程运行结束才继续向下执行
print('主线程的num', num)

8.多进程和多线程的效率对比
对于io密集型的, 多线程的时间较快
def f1():
time.sleep(1) #io密集型 if __name__ == '__main__':
# 查看一下20个线程执行20个任务的执行时间
t_s_time = time.time()
t_list = []
for i in range(5):
t = Thread(target=f1,)
t.start()
t_list.append(t)
[tt.join() for tt in t_list]
t_e_time = time.time()
t_dif_time = t_e_time - t_s_time
# 查看一下20个进程执行同样的任务的执行时间
p_s_time = time.time()
p_list = []
for i in range(5):
p = Process(target=f1,)
p.start()
p_list.append(p)
[pp.join() for pp in p_list]
p_e_time = time.time()
p_dif_time = p_e_time - p_s_time
print('多线程的执行时间:', t_dif_time)
print('多jincheng的执行时间:', p_dif_time)

计算型:
import time
from threading import Thread
from multiprocessing import Process def f1():
# 计算型:
n = 10
for i in range(10000000):
n = n + i
if __name__ == '__main__':
# 查看一下20个线程执行20个任务的执行时间
t_s_time = time.time()
t_list = []
for i in range(5):
t = Thread(target=f1,)
t.start()
t_list.append(t)
[tt.join() for tt in t_list]
t_e_time = time.time()
t_dif_time = t_e_time - t_s_time
# 查看一下20个进程执行同样的任务的执行时间
p_s_time = time.time()
p_list = []
for i in range(5):
p = Process(target=f1,)
p.start()
p_list.append(p)
[pp.join() for pp in p_list]
p_e_time = time.time()
p_dif_time = p_e_time - p_s_time
print('多线程的执行时间:', t_dif_time)
print('多jincheng的执行时间:', p_dif_time)

9.锁,同步,互斥锁 为了保护多线成中数据的完整性和线程间状态的同步.(同进程的锁一样)
在线程锁中, 会产生死锁现象. 同时抢锁
import time
from threading import Thread, Lock, RLock
def f1(locA, locB):
# print('xxxx')
# time.sleep(0.1)
locA.acquire()
print('f1>>1号抢到了A锁') time.sleep(1)
locB.acquire()
print('f1>>1号抢到了B锁')
locB.release() locA.release()
def f2(locA, locB):
print('')
time.sleep(0.1)
locB.acquire()
print('f2>>2号抢到了B锁')
locA.acquire()
time.sleep(1)
print('f2>>2号抢到了A锁')
locA.release()
locB.release()
if __name__ == '__main__':
locA = Lock()
locB = Lock()
t1 = Thread(target=f1, args=(locA, locB))
t2 = Thread(target=f2, args=(locA, locB))
t1.start()
t2.start()
递归锁解决了 死锁现象
import time
from threading import Thread, Lock, RLock def f1(locA, locB):
print('xxxxx')
time.sleep(0.1)
locA.acquire()
print('f1>>>1号抢到了A锁')
time.sleep(1)
locB.acquire()
print('f1>>>2号抢到了B锁')
locB.release()
locA.release()
def f2(locA, locB):
print('')
time.sleep(0.1)
locB.acquire()
print('f2>>>1号抢到了A锁')
time.sleep(1)
locA.acquire()
print('f2>>>2号抢到了B锁')
locA.release()
locB.release()
if __name__ == '__main__':
locA = locB = RLock()
t1 = Thread(target=f1, args=(locA, locB))
t2 = Thread(target=f2, args=(locB, locA))
t1.start()
t2.start()

10.多线程的程序不结束 和 多进程的程序不结束的区别
守护进程:主进程代码执行运行结束,守护进程随之结束
守护线程:守护线程会等待所有非守护线程运行结束才结束
import time
from threading import Thread
from multiprocessing import Process # 守护进程:主进程代码执行运行结束,守护进程随之结束
# 守护线程:守护线程会等待所有非守护线程运行结束才结束
def f1():
time.sleep(2)
print('一号线程') def f2():
time.sleep(3)
print('二号线程')
def f3():
time.sleep(2)
print('一号进程') def f4():
time.sleep(3)
print('二号进程')
if __name__ == '__main__':
# t1 = Thread(target=f1,)
# t2 = Thread(target=f2,)
# # t1.daemon = True # 等非守护线程结束,守护线程才会结束 结果: 主线程结束 一号线程 二号线程
# t2.daemon = True # 结果: 主线程结束 一号线程
# t1.start()
# t2.start()
# print('主线程结束')
p1 = Process(target=f3,)
p2 = Process(target=f4,)
# p1.daemon = True # 结果: 主进程 二号线程
p2.daemon= True # 结果: 主进程 一号线程
p1.start()
p2.start()
print('主进程')
11. GIL锁 : cpython解释器上的一把互斥锁, Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核
Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

python之线程相关操作的更多相关文章
- python之线程相关操作(补充)
1 线程的其他方法 import threading import time from threading import Thread, current_thread def f1(n): time. ...
- Python字符串的相关操作
1.大小写转换 判断字符串 s.isalnum() #所有字符都是数字或者字母 s.isalpha() #所有字符都是字母 s.isdigit() #所有字符都是数字 s.islower() #所有字 ...
- Selenium2+python自动化40-cookie相关操作
前言 虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录. 登录后换账号登录时候,也可作为后置条件去删除cookie ...
- python文件的相关操作
python 目录 python 1.python文件的介绍 使用文件的目的 Python文件的类型主要有两种:文本文件和二进制文件. 操作文件的流程主要有三步:打开-操作-关闭操作. 2.文件的打开 ...
- Selenium2+python自动化40-cookie相关操作【转载】
前言 虽然cookie相关操作在平常ui自动化中用得少,偶尔也会用到,比如登录有图形验证码,可以通过绕过验证码方式,添加cookie方法登录. 登录后换账号登录时候,也可作为后置条件去删除cookie ...
- Python字典及相关操作(内含例题)
Python字典类型 今天将会介绍一种在python中十分常见的组合数据类型——字典 通过一些实例来理解字典中的常规操作 什么是字典类型? 列表中查找是通过整数的索引(元素在列表中的序号)来实现查找功 ...
- python之线程相关的其他方法
一.join方法 (1)开一个主线程 from threading import Thread,currentThread import time def walk(): print('%s is r ...
- Python系统(os)相关操作
文件操作 python中常用于文件处理的模块有os,shutil等. 1 创建文件 文件的创建可以使用open()函数,如下创建一个test_file.txt的文件: >>> wit ...
- python集合set相关操作
定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 1 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 1 2 3 >>> set_test ...
随机推荐
- 快速部署Apache服务静态网站
Apache是世界使用排名第一的Web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一.它快速.可靠并且可通过简单的API扩充, ...
- Burpsuite常用模块详解以及渗透测试上的运用
0x00前言 哪有什么前言,大家好,我是浅安.QQ:320229344... 0x01 JDK的安装,以及Burpsuite的成功开启. burpsuite基于JAVA环境才能正常运行的.所以要先安装 ...
- Android:weight,margin,padding详解实例
weight详解 weight是用来等比例划分区域的属性. 案例代码 <LinearLayout xmlns:android="http://schemas.android.com/a ...
- MySQL:explain 和 慢查询日志
1. 执行SQL时显示执行情况 explain + SQL语句 2. 强制使用索引 select * from t force index (a) where a between 1 ...
- IDEA搭建SSM实现登录、注册,数据增删改查功能
本博文的源代码:百度云盘/java/java实例/SSM实例/SSM实现登录注册,增删改查/IDEA搭建SSM实现登录,注册,增删改查功能.zip 搭建空的Maven项目 使用Intellij id ...
- linux下的初始化系统systemd简科普
systemd是什么?名字很奇怪,不认识. 扒一扒wiki,你就会知道我是谁了? 在下有眼不识泰山,原来你就是盘古老爷爷用的开天辟地大斧头啊. 贫穷不可怕,可怕的是贫穷限制了你的想象--------- ...
- Hadoop生态系统之Yarn
Apache YARN(Yet Another Resource Negotiator) 是Hadoop的集群资源管理系统.YARN被引入Hadoop2最初是为了改善MapReduce的实现,但它具有 ...
- Oracle Database 12c Release 2安装过程实录
前言----------公司数据库用的是oracle,由于oracle数据库没有做监控,所有搭个环境用于测试zabbix通过orabbix插件监控oracle数据库,下面先搭建oracle数据库. 简 ...
- Vue + Element UI 实现权限管理系统 前端篇(十一):第三方图标库
使用第三方图标库 用过Elment的同鞋都知道,Element UI提供的字体图符少之又少,实在是不够用啊,幸好现在有不少丰富的第三方图标库可用,引入也不会很麻烦. Font Awesome Font ...
- PostgreSQL事务实现
事务简介 事务管理器:有限状态机 日志管理器 CLOG:事务的执行结果 XLOG:undo/redo日志 锁管理器:实现并发控制,读阶段采用MVCC,写阶段采用锁控制实现不同的隔离级别 Postgre ...