Python中的多线程实例(简单易懂)
作者:时代&信念 发布时间:2021-12-07 04:09:47
标签:Python,多线程
前言:
多线程简单理解就是:一个CPU,也就是单核,将时间切成一片一片的,CPU轮转着去处理一件一件的事情,到了规定的时间片就处理下一件事情。
1.python中显示当前线程信息的属性和方法
# coding:utf-8
# 导入threading包
import threading
if __name__ == "__main__":
print("当前活跃线程的数量", threading.active_count())
print("将当前所有线程的具体信息展示出来", threading.enumerate())
print("当前的线程的信息展示", threading.current_thread())
效果图:
2.添加一个线程
# coding:utf-8
import threading
import time
def job1():
# 让这个线程多执行几秒
time.sleep(5)
print("the number of T1 is %s" % threading.current_thread())
if __name__ == "__main__":
# 创建一个新的线程
new_thread = threading.Thread(target=job1, name="T1")
# 启动新线程
new_thread.start()
print("当前线程数量为", threading.active_count())
print("所有线程的具体信息", threading.enumerate())
print("当前线程具体信息", threading.current_thread())
效果图:
3.线程中的join函数
(1)预想的是,执行完线程1,然后输出All done…“理想很丰满,现实却不是这样的”
# coding:utf-8
import threading
import time
def job1():
print("T1 start")
for i in range(5):
time.sleep(1)
print(i)
print("T1 finish")
def main():
# 新创建一个线程
new_thread = threading.Thread(target=job1, name="T1")
# 启动新线程
new_thread.start()
print("All done...")
if __name__ == "__main__":
main()
效果图:
(2)为了达到我们的预期,我们使用join函数,将T1线程进行阻塞。join函数进行阻塞是什么意思?就是哪个线程使用了join函数,当这个线程正在执行时,在他之后的线程程序不能执行,得等这个被阻塞的线程全部执行完毕之后,方可执行!
# coding:utf-8
import threading
import time
def job1():
print("T1 start")
for i in range(5):
time.sleep(1)
print(i)
print("T1 finish")
def main():
# 新创建一个线程
new_thread = threading.Thread(target=job1, name="T1")
# 启动新线程
new_thread.start()
# 阻塞这个T1线程
new_thread.join()
print("All done...")
if __name__ == "__main__":
main()
效果图:
4.使用Queue存储线程的结果
线程的执行结果,无法通过return进行返回,使用Queue存储。
# coding:utf-8
import threading
from queue import Queue
"""
Queue的使用
"""
def job(l, q):
for i in range(len(l)):
l[i] = l[i] ** 2
q.put(l)
def multithreading():
# 创建队列
q = Queue()
# 线程列表
threads = []
# 二维列表
data = [[1, 2, 3], [4, 5, 6], [7, 8, 9], [6, 6, 6]]
for i in range(4):
t = threading.Thread(target=job, args=(data[i], q))
t.start()
threads.append(t)
# 对所有线程进行阻塞
for thread in threads:
thread.join()
results = []
# 将新队列中的每个元素挨个放到结果列表中
for _ in range(4):
results.append(q.get())
print(results)
if __name__ == "__main__":
multithreading()
效果图:
5.线程锁lock
当同时启动多个线程时,各个线程之间会互相抢占计算资源,会造成程序混乱。
举个栗子:
当我们在选课系统选课时,当前篮球课还有2个名额,我们三个人去选课。
选课顺序为stu1 stu2 stu3,应该依次打印他们三个的选课过程,但是现实情况却是:
# coding:utf-8
import threading
import time
def stu1():
print("stu1开始选课")
global course
if course > 0:
course -= 1
time.sleep(2)
print("stu1选课成功,现在篮球课所剩名额为%d" % course)
else:
time.sleep(2)
print("stu1选课失败,篮球课名额为0,请选择其他课程")
def stu2():
print("stu2开始选课")
global course
if course > 0:
course -= 1
time.sleep(2)
print("stu2选课成功,现在篮球课所剩名额为%d" % course)
else:
time.sleep(2)
print("stu2选课失败,篮球课名额为0,请选择其他课程")
def stu3():
print("stu3开始选课")
global course
if course > 0:
course -= 1
time.sleep(2)
print("stu3选课成功")
print("篮球课所剩名额为%d" %course)
else:
time.sleep(2)
print("stu3选课失败,篮球课名额为0,请选择其他课程")
if __name__ == "__main__":
# 篮球课名额
course = 2
T1 = threading.Thread(target=stu1, name="T1")
T2 = threading.Thread(target=stu2, name="T2")
T3 = threading.Thread(target=stu3, name="T3")
T1.start()
T2.start()
T3.start()
效果图:
为了解决这种情况,我们使用lock线程同步锁,在线程并发执行时,保证每个线程执行的原子性。有效防止了共享统一数据时,线程并发执行的混乱。
改进的代码如下:
# coding:utf-8
import threading
import time
def stu1():
global lock
lock.acquire()
print("stu1开始选课")
global course
if course > 0:
course -= 1
time.sleep(2)
print("stu1选课成功,现在篮球课所剩名额为%d" % course)
else:
time.sleep(2)
print("stu1选课失败,篮球课名额为0,请选择其他课程")
lock.release()
def stu2():
global lock
lock.acquire()
print("stu2开始选课")
global course
if course > 0:
course -= 1
print("stu2选课成功,现在篮球课所剩名额为%d" % course)
else:
time.sleep(1)
print("stu2选课失败,篮球课名额为0,请选择其他课程")
lock.release()
def stu3():
global lock
lock.acquire()
print("stu3开始选课")
global course
if course > 0:
course -= 1
time.sleep(1)
print("stu3选课成功,现在篮球课所剩名额为%d" % course)
else:
time.sleep(1)
print("stu3选课失败,篮球课名额为0,请选择其他课程")
lock.release()
if __name__ == "__main__":
# 篮球课名额
course = 2
# 创建同步锁
lock = threading.Lock()
T1 = threading.Thread(target=stu1, name="T1")
T2 = threading.Thread(target=stu2, name="T2")
T3 = threading.Thread(target=stu3, name="T3")
T1.start()
T2.start()
T3.start()
效果图:
来源:https://blog.csdn.net/Elon15/article/details/125350491


猜你喜欢
- 这里我们采用的是使用Oracle数据库进行相关操作在连接数据库之间,应下载相应的工具包cx_Oracle,在你安装的Python文件夹中找到
- mysql-proxy实现读写分离MySQL Proxy是一个处于你的client端和MySQL server端之间的简单程序,它可以监测、
- 本文实例讲述了Python实现监控程序执行时间并将其写入日志的方法。分享给大家供大家参考。具体实现方法如下:# /usr/bin/pytho
- 最近对list设计感兴趣,今天说的是list视图方式的设计。感觉有些细节非常有意思,拿出来跟大家讨论。首先我们来看下windows下文件夹管
- 一、问题的提出随着互连网的发展,网站的数量以惊人的数字增加。网站的作用除了给广大网友们提供信息资讯服务外,还应该成为网友们上传与下载文件的场
- 本文实例讲述了Python pygorithm模块用法。分享给大家供大家参考,具体如下:pygorithm:一个用纯粹python编写的Py
- 1. 用Dreamweaver 4.0制作闪动的Flash按钮选择菜单Insert→Interactive Images→Flash But
- 一,分析代码运行时间第1式,测算代码运行时间平凡方法快捷方法(jupyter环境)第2式,测算代码多次运行平均时间平凡方法快捷方法(jupy
- SELECT TABLE_SCHEMA,TABLE_NAME FROM information_schema.`COLUMNS` WHERE
- 使用python基于cartopy库绘制台风路径使用python 绘制西太平洋进入我国的台风路径,文件为.dat格式,内容如下所示:代码如下
- 效果图先看一下效果图就当是女友无聊的时候自己抽不出时间的小分身吧!需要用到的库tkinter、time、urllib、requeststki
- 一个常常令设计师和前端开发人员都头疼的事情就是字体的使用,设计师常常在设计稿中使用某些很漂亮的字体,以实现比较酷炫的界面。但这样常常给编码人
- 如何用ASP输出HTML文件?<!--#include file="top.inc"--><
- 1.安装2.操作一个简单的Excel文档操作注释及代码:操作完成后,数据存储结果如下:3. 操作简单Excel文档并添加数据格式操作代码如下
- 目录1. 首先2. 编程惯用法3. 基础用法4. 库的使用5. 设计模式6. 内部机制7. 使用工具辅助项目开发8. 性能剖析与优化1. 首
- 一、遍历函数(map)map函数用于遍历序列,对序列中每个元素进行操作,最终获取新的序列。lis=[2,3,4,5]new_list=map
- 项目地址:https://github.com/astak16/shortlink错误处理在处理业务逻辑时,如果出错误了,需要统一处理错误响
- 打开文件操作文件1打开文件时,需要指定文件路径和打开方式打开方式:r:只读w:只写a:追加“+”表示可以同时读写某个文件r+:读写w+:写读
- 一. create优化在serializer序列化中,我们通过创建序列化器对象的方式地简化了视图函数的代码,前端传入的数据通过反序列化操作进
- 如何复制一个对象不考虑IDE提供的代码分析和go vet之类的静态分析工具,golang里几乎所有的类型都能被复制。// 基本标量类型和指针