Python 多线程Threading初学教程
发布时间 - 2026-01-11 02:54:49 点击率:次1.1 什么是多线程 Threading

多线程可简单理解为同时执行多个任务。
多进程和多线程都可以执行多个任务,线程是进程的一部分。线程的特点是线程之间可以共享内存和变量,资源消耗少(不过在Unix环境中,多进程和多线程资源调度消耗差距不明显,Unix调度较快),缺点是线程之间的同步和加锁比较麻烦。
1.2 添加线程 Thread
导入模块
import threading
获取已激活的线程数
threading.active_count()
查看所有线程信息
threading.enumerate()
查看现在正在运行的线程
threading.current_thread()
添加线程,threading.Thread()接收参数target代表这个线程要完成的任务,需自行定义
def thread_job():
print('This is a thread of %s' % threading.current_thread())
def main():
thread = threading.Thread(target=thread_job,) # 定义线程
thread.start() # 让线程开始工作
if __name__ == '__main__':
main()
1.3 join 功能
因为线程是同时进行的,使用join功能可让线程完成后再进行下一步操作,即阻塞调用线程,直到队列中的所有任务被处理掉。
import threading
import time
def thread_job():
print('T1 start\n')
for i in range(10):
time.sleep(0.1)
print('T1 finish\n')
def T2_job():
print('T2 start\n')
print('T2 finish\n')
def main():
added_thread=threading.Thread(target=thread_job,name='T1')
thread2=threading.Thread(target=T2_job,name='T2')
added_thread.start()
#added_thread.join()
thread2.start()
#thread2.join()
print('all done\n')
if __name__=='__main__':
main()
例子如上所示,当不使用join功能的时候,结果如下图所示:
当执行了join功能之后,T1运行完之后才运行T2,之后再运行print(‘all done')
1.4 储存进程结果 queue
queue是python标准库中的线程安全的队列(FIFO)实现,提供了一个适用于多线程编程的先进先出的数据结构,即队列,用来在生产者和消费者线程之间的信息传递
(1)基本FIFO队列
class queue.Queue(maxsize=0)
maxsize是整数,表明队列中能存放的数据个数的上限,达到上限时,插入会导致阻塞,直至队列中的数据被消费掉,如果maxsize小于或者等于0,队列大小没有限制
(2)LIFO队列 last in first out后进先出
class queue.LifoQueue(maxsize=0)
(3)优先级队列
class queue.PriorityQueue(maxsize=0)
视频中的代码,看的还不是特别明白
import threading
import time
from queue import 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],[3,4,5],[4,5,6],[5,6,7]]
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()
运行结果如下所示
图片截取来源:http://www.cnblogs.com/itogo/p/5635629.html
1.5 GIL 不一定有效率
Global Interpreter Lock全局解释器锁,python的执行由python虚拟机(也成解释器主循环)控制,GIL的控制对python虚拟机的访问,保证在任意时刻,只有一个线程在解释器中运行。在多线程环境中能,python虚拟机按照以下方式执行:
1.设置 GIL
2.切换到一个线程去运行
3.运行:
a.指定数量的字节码指令,或
b.线程主动让出控制(可以调用time.sleep(0))
4.把线程设置为睡眠状态
5.解锁GIL
6.重复1-5
在调用外部代码(如C/C++扩展函数)的时候,GIL将会被锁定,直到这个函数结束为止(由于在这期间没有python的字节码被运行,所以不会做线程切换)。
下面为视频中所举例的代码,将一个数扩大4倍,分为正常方式、以及分配给4个线程去做,发现耗时其实并没有相差太多量级。
import threading
from queue import Queue
import copy
import time
def job(l, q):
res = sum(l)
q.put(res)
def multithreading(l):
q = Queue()
threads = []
for i in range(4):
t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
t.start()
threads.append(t)
[t.join() for t in threads]
total = 0
for _ in range(4):
total += q.get()
print(total)
def normal(l):
total = sum(l)
print(total)
if __name__ == '__main__':
l = list(range(1000000))
s_t = time.time()
normal(l*4)
print('normal: ',time.time()-s_t)
s_t = time.time()
multithreading(l)
print('multithreading: ', time.time()-s_t)
运行结果为:
1.6 线程锁 Lock
如果线程1得到了结果,想要让线程2继续使用1的结果进行处理,则需要对1lock,等到1执行完,再开始执行线程2。一般来说对share memory即对共享内存进行加工处理时会用到lock。
import threading
def job1():
global A, lock #全局变量
lock.acquire() #开始lock
for i in range(10):
A += 1
print('job1', A)
lock.release() #释放
def job2():
global A, lock
lock.acquire()
for i in range(10):
A += 10
print('job2', A)
lock.release()
if __name__ == '__main__':
lock = threading.Lock()
A = 0
t1 = threading.Thread(target=job1)
t2 = threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
运行结果如下所示:
总结
以上所述是小编给大家介绍的Python 多线程Threading初学教程,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
# python
# 多线程
# threading
# python多线程threading.Lock锁用法实例
# Python多线程threading和multiprocessing模块实例解析
# Python多线程threading模块用法实例分析
# Python多线程threading join和守护线程setDeamon原理详解
# python 多线程中子线程和主线程相互通信方法
# python子线程退出及线程退出控制的代码
# python主线程捕获子线程的方法
# python从子线程中获得返回值的方法
# python主线程与子线程的结束顺序实例解析
# Python 多线程
# threading模块
# 创建子线程的两种方式示例
# python实现守护进程、守护线程、守护非守护并行
# Python多线程Threading、子线程与守护线程实例详解
# 所示
# 多个
# 小编
# 中能
# 太多
# 将会
# 在这
# 在此
# 适用于
# 数据结构
# 给大家
# 去做
# 只有一个
# 要对
# 设置为
# 后才
# 较快
# 会做
# 所述
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何在HTML表单中获取用户输入并用JavaScript动态控制复利计算循环
大学网站设计制作软件有哪些,如何将网站制作成自己app?
Laravel怎么使用artisan命令缓存配置和视图
如何用景安虚拟主机手机版绑定域名建站?
如何将凡科建站内容保存为本地文件?
,在苏州找工作,上哪个网站比较好?
品牌网站制作公司有哪些,买正品品牌一般去哪个网站买?
Laravel表单请求验证类怎么用_Laravel Form Request分离验证逻辑教程
Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】
微博html5版本怎么弄发语音微博_语音录制入口及时长限制操作【教程】
C++用Dijkstra(迪杰斯特拉)算法求最短路径
Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】
php8.4header发送头信息失败怎么办_php8.4header函数问题解决【解答】
Python自然语言搜索引擎项目教程_倒排索引查询优化案例
如何用IIS7快速搭建并优化网站站点?
三星网站视频制作教程下载,三星w23网页如何全屏?
html5audio标签播放结束怎么触发事件_onended回调方法【教程】
Laravel N+1查询问题如何解决_Eloquent预加载(Eager Loading)优化数据库查询
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
无锡营销型网站制作公司,无锡网选车牌流程?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
网站制作壁纸教程视频,电脑壁纸网站?
高端企业智能建站程序:SEO优化与响应式模板定制开发
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
如何快速使用云服务器搭建个人网站?
JavaScript如何实现音频处理_Web Audio API如何工作?
IOS倒计时设置UIButton标题title的抖动问题
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
如何快速生成凡客建站的专业级图册?
如何在橙子建站中快速调整背景颜色?
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
如何快速搭建支持数据库操作的智能建站平台?
C语言设计一个闪闪的圣诞树
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
Laravel如何创建自定义中间件?(Middleware代码示例)
高防服务器租用首荐平台,企业级优惠套餐快速部署
Python函数文档自动校验_规范解析【教程】
如何在阿里云部署织梦网站?
如何快速搭建高效WAP手机网站?
如何在建站宝盒中设置产品搜索功能?
如何基于云服务器快速搭建个人网站?
什么是javascript作用域_全局和局部作用域有什么区别?
PHP 500报错的快速解决方法
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?
如何在局域网内绑定自建网站域名?
Laravel DB事务怎么使用_Laravel数据库事务回滚操作
北京的网站制作公司有哪些,哪个视频网站最好?

