-
多线程下每个线程的执行方式
在Python多线程下,每个线程的执行方式:
1、获取GIL
2、执行代码直到sleep或是python虚拟机将其挂起。
3、释放GIL
GIL全局解析器锁(global interpreter lock),其作用在单核的情况下可以实现多任务(并发) 每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行
并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。
多线程并不会充分调用两个CPU,而是会像在一个CPU上充分运转,而多进程则是会完全调用两个CPU,同时执行;
对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。
Python 多线程实例
import threading
from queue import Queue
def list_Avg(list_1):
# 取列表值的总和
Len = len(list_1)
total=0
for i in range(0, len(list_1)):
total = total + list_1[i]
Avg = total / Len
return Avg
def job(li, q):
q.put(list_Avg(li)) # 将任务的执行结果存储到队列中;
def use_thread():
# 实例化一个队列, 用来存储每个线程执行的结果
q = Queue()
list1 = [range(6), range(6,18), range(1000, 6000)]
# 创建线程列表
threads = []
for li in list1:
t = threading.Thread(target=job, args=(li, q))
t.start()
threads.append(t)
for thread in threads:
thread.join()
# 等待队列中所有线程完成;
results = []
for li in list1:
results.append(q.get())
print(results)
if __name__ == "__main__":
use_thread()
1、获取GIL
2、执行代码直到sleep或是python虚拟机将其挂起。
3、释放GIL
GIL全局解析器锁(global interpreter lock),其作用在单核的情况下可以实现多任务(并发) 每个线程在执行时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU,也就是说多线程并不是真正意义上的同时执行
并行:多个CPU同时执行多个任务,就好像有两个程序,这两个程序是真的在两个不同的CPU内同时被执行。
并发:CPU交替处理多个任务,还是有两个程序,但是只有一个CPU,会交替处理这两个程序,而不是同时执行,只不过因为CPU执行的速度过快,而会使得人们感到是在“同时”执行,执行的先后取决于各个程序对于时间片资源的争夺。并行和并发同属于多任务,目的是要提高CPU的使用效率。这里需要注意的是,一个CPU永远不可能实现并行,即一个CPU不能同时运行多个程序,但是可以在随机分配的时间片内交替执行(并发),就好像一个人不能同时看两本书,但是却能够先看第一本书半分钟,再看第二本书半分钟,这样来回切换。
多线程并不会充分调用两个CPU,而是会像在一个CPU上充分运转,而多进程则是会完全调用两个CPU,同时执行;
对于任何Python程序,不管有多少的处理器,任何时候都总是只有一个线程在执行。
Python 多线程实例
import threading
from queue import Queue
def list_Avg(list_1):
# 取列表值的总和
Len = len(list_1)
total=0
for i in range(0, len(list_1)):
total = total + list_1[i]
Avg = total / Len
return Avg
def job(li, q):
q.put(list_Avg(li)) # 将任务的执行结果存储到队列中;
def use_thread():
# 实例化一个队列, 用来存储每个线程执行的结果
q = Queue()
list1 = [range(6), range(6,18), range(1000, 6000)]
# 创建线程列表
threads = []
for li in list1:
t = threading.Thread(target=job, args=(li, q))
t.start()
threads.append(t)
for thread in threads:
thread.join()
# 等待队列中所有线程完成;
results = []
for li in list1:
results.append(q.get())
print(results)
if __name__ == "__main__":
use_thread()
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
JavaScript判断两个数组相等的四类方法
js如何操作video标签
React实战--利用甘特图和看板,强化Paas平
【记录】正则替换的偏方
前端下载 Blob 类型整理
抽象语法树AST必知必会
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程