初识python:多线程
2024-09-26 18:03:12
多线程:在一个程序中,独立运行的程序片断叫作“线程”(Thread),利用它编程的概念就叫作“多线程处理”。即:一个进程中,多个线程。
举个例说明:就像是一列火车就是一个“进程”(程序),火车的每一节车厢就是一个“线程”。每个线程可以独立的做一些事情。
python 中 threading 模块提供了多线程编程方法。
threading.enumerate() 查看
当前线程的数量
threading.current_thread() 查看
当前线程的信息
下面通过两种方式加以说明“多线程”模式。
功能:运行两个“功能”,一个“写”,一个“画”。
一、传统方式
def coding():
for i in range(3):
print('正在写入:',i)
time.sleep(1) def drawing():
for i in range(3):
print('正在画图:',i)
time.sleep(1) def main():
coding()
drawing() if __name__ == '__main__':
main()
执行结果: 一个一个执行,共耗时6s。
二、多线程方式
def coding():
for i in range(3):
print('正在写入:',i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) def drawing():
for i in range(3):
print('正在画图:',i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) # 多线程方式执行
def thread():
t1 = threading.Thread(target=coding) # 注意,此处target传入的是一个函数(coding就是一个函数),不是函数的返回值(coding()是函数的返回值)
t2 = threading.Thread(target=drawing)
t1.start()
t2.start()
print(threading.enumerate()) # 查看当前线程数量 # [<_MainThread(MainThread, started 7020)>, <Thread(Thread-1, started 2088)>, <Thread(Thread-2, started 7516)>] if __name__ == '__main__':
thread()
执行结果:两个同时执行,共耗时3s。
由上对比,可以看出:多线程执行效率比传统单线程方式的执行效率高很多。
多线程 threading.Thread 类 方法
class CodingThread(threading.Thread):
def run(self):
for i in range(3):
print('正在写入:', i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) class DrawingThread(threading.Thread):
def run(self):
for i in range(3):
print('正在画图:', i)
print(threading.current_thread()) # 查看当前线程的名字
time.sleep(1) def main():
t1 = CodingThread()
t2 = DrawingThread()
t1.start()
t2.start() if __name__ == '__main__':
main()
执行结果:
多线程共享全局变量
多线程都是在同一个进程中运行的。因此在进程中的全局变量所有线程都是可共享的。这就造成了一个问题,因为线程执行的顺序是无序的。有可能会造成数据错误。比如以下代码:
VALUE = 0 # 定义全局变量
def add_value():
global VALUE # 指定是一个全局变量
for i in range(1000000):
VALUE += 1 # 修改全局变量值
print(VALUE) # 使用线程方式执行,两个线程同时执行 add_value
def main():
for x in range(2):
t = threading.Thread(target=add_value)
t.start() if __name__ == '__main__':
main()
执行结果:
锁机制:
变量名 = threading.Lock() # 创建锁
acquire() # 加锁
release() # 解锁
为了解决以上使用共享全局变量的问题。threading
提供了一个Lock
类,这个类可以在某个线程访问某个变量的时候加锁,其他线程此时就不能进来,直到当前线程处理完后,把锁释放了,其他线程才能进来处理。示例代码如下:
VALUE = 0 # 定义全局变量 # 创建锁
gLock = threading.Lock() def add_value():
global VALUE # 指定是一个全局变量
gLock.acquire() # 加锁
for i in range(1000000):
VALUE += 1 # 修改全局变量值
gLock.release() # 解锁
print(VALUE) # 使用线程方式执行
def main():
for x in range(2):
t = threading.Thread(target=add_value)
t.start() if __name__ == '__main__':
main()
执行结果:
最新文章
- 【C#】无损转换Image为Icon
- Mac OS X 中快速访问系统根目录的四种方法
- Android之debug---menu的getActionView()return null
- Jquery省市区三级联动案例
- CentOS系统将UTC时间修改为CST时间
- FOJ 2013 11 月赛
- 【转】成功在AMD主机上用虚拟机安装原版雪豹
- spoj 346
- javascript 获取url参数
- Unity给力插件之MeshBaker
- linux 系统调优2
- Mybatis(1)
- 81. Search in Rotated Sorted Array II (中等)
- Java JDK动态代理解析
- day4 字符串的操作
- springboot springcloud 父项目pom工程创建pom文件
- winform 之MDI容器
- PCB布线经验
- iOS开发中的Markdown渲染
- Linux下objdump查看C程序编译后的汇编代码
热门文章
- 【Spring Framework】Spring入门教程(三)使用注解配置
- Mycat的事务异常:Caused by: java.sql.SQLException: Transaction error, need to rollback.Distributed transaction is disabled!
- python3约瑟夫环问题
- 为什么kafka和zk总是在一起?
- 试工具_ab
- SQLserver 2014自定义备份数据库
- [BUUCTF]REVERSE——[GKCTF2020]BabyDriver
- 学习型的“文山表海无限发展公司”——《Office妖精是怎样炼成的》续1
- Java中List排序的3种方法
- 深度解析HashMap