Python多线程与GIL锁
Python多线程与GIL锁
python多线程
Python的多线程编程可以在单个进程内创建多个线程来同时执行多个任务,从而提高程序的效率和性能。Python的多线程实现依赖于操作系统的线程调度器,并且受到全局解释器锁(GIL)的限制,因此在某些情况下,多线程并不能真正实现并行执行。
import threading
def print_numbers():
for i in range(1, 6):
print(i)
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
print("Done")
上述代码创建了两个线程分别同时去打印1-5数字,但是即使有多个cpu,同一时刻也只能打印一个数字!why?
这是由于Python中的全局解释器锁(GIL)导致的。GIL是一种机制,用于确保在任何给定时间内,只有一个线程在Python解释器中执行字节码。这意味着无论有多少个CPU核心,每个线程都无法并行执行Python字节码。因此在执行CPU密集型任务时,多个线程之间的执行是交替进行的,而不是并行的。因此对于CPU任务,python的多线程是假的。而对于IO任务,确实是真正的多线程。
GIL锁
GIL的存在主要是为了防止Python解释器中的数据结构被多个线程同时修改,导致数据结构出现不一致的情况。通过限制同一时刻只有一个线程能够执行Python字节码,GIL可以确保Python解释器中的数据结构不会被多个线程同时修改,从而保证线程安全。
IO任务
I/O资源(Input/Output resources),是指计算机系统中用于输入输出数据的设备和接口,例如硬盘、网络接口、键盘、鼠标等。在计算机编程中,I/O操作指的是程序和外部设备之间进行的数据传输和交互,如读取文件、网络传输,爬虫等。I/O操作通常是非常耗时的,因为它们需要等待外部设备响应或者等待数据的读取。
这些IO任务通常只占用内存和网络,不占用CPU资源,所以也不占用python解释器,因此如果是IO密集型任务,python的多线程优势才能体现出来,而CPU密集型任务python的多线程效率无法有效提升。
破解GIL锁的限制
如果需要处理CPU密集型任务,可以考虑使用多进程编程,因为在多进程中,每个进程都有自己的解释器和内存空间,从而避免了GIL的限制。可以充分利用多核处理器(必须是真正的多核处理器才能体现,否则还是单进程)的优势。
python多进程
使用Python多进程编程的一般步骤如下:
- 导入multiprocessing模块,创建进程池对象。可以通过Pool()函数创建进程池对象,指定最大进程数。
- 定义需要执行的任务函数。这个函数应该能够接受任务参数,处理任务,返回任务结果。
- 调用进程池对象的map()函数,传入任务函数和任务参数。该函数会将任务参数分配给进程池中的进程执行,并返回任务结果列表。
- 处理任务结果。根据任务函数的返回值,对任务结果进行处理。可以使用Python中的其他模块,如pandas、numpy等进行数据处理或结果可视化。
需要注意的是,在Python中使用多进程编程时,进程之间的通信和同步是需要考虑的问题。Python中的multiprocessing模块提供了一些同步原语,如Lock、Semaphore等,用于控制进程之间的访问。此外,也可以使用Python中的Queue模块实现进程之间的通信。
代码示例:
import multiprocessing
def worker(num):
"""任务函数"""
print('Worker %d is running' % num)
return num**2
if __name__ == '__main__':
# 创建进程池对象
pool = multiprocessing.Pool(processes=4)
# 任务参数列表
nums = [1, 2, 3, 4, 5]
# 执行任务并获取结果
results = pool.map(worker, nums)
print(results)
python多进程与多线程的结合
每个进程用多个线程执行,这样可以在每个进程内部实现并行处理IO任务,同时也可以充分利用多核处理器的优势。
代码示例:
import multiprocessing
import threading
def worker(num):
"""线程函数,用于处理任务"""
print(f"Worker {num} is running...")
def main():
"""主函数,创建多个进程和线程"""
# 创建3个进程
processes = []
for i in range(3):
p = multiprocessing.Process(target=process_worker, args=(i,))
processes.append(p)
p.start()
# 在每个进程内部创建2个线程
for p in processes:
for i in range(2):
t = threading.Thread(target=worker, args=(i,))
t.start()
if __name__ == '__main__':
main()
Python多线程与GIL锁的更多相关文章
- Python中的GIL锁
在Python中,可以通过多进程.多线程和多协程来实现多任务. 在多线程的实现过程中,为了避免出现资源竞争问题,可以使用互斥锁来使线程同步(按顺序)执行. 但是,其实Python的CPython(C语 ...
- python全局解释器GIL锁(-死锁)
目录 一:Python中的GIL锁 1.GIL介绍 2.GIL的作用 3.cpython 4.内存管理>>>垃圾回收机制 二:全局解释器锁GIL 1.GIL特点 三:计算密集型与IO ...
- python多线程threading.Lock锁用法实例
本文实例讲述了python多线程threading.Lock锁的用法实例,分享给大家供大家参考.具体分析如下: python的锁可以独立提取出来 mutex = threading.Lock() #锁 ...
- python笔记9 线程进程 threading多线程模块 GIL锁 multiprocessing多进程模块 同步锁Lock 队列queue IO模型
线程与进程 进程 进程就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成.我们编写的程序用来描述进程要完成哪些功能以及如何完成:数据集则是程序在执行过程中所需要 ...
- python多线程和GIL全局解释器锁
1.线程 线程被称为轻量级进程,是最小执行单元,系统调度的单位.线程切换需要的资源一般,效率一般. 2.多线程 在单个程序中同时运行多个线程完成不同的工作,称为多线程 3.并 ...
- python多线程与GIL(转)
作者:卢钧轶(cenalulu) 本文原文地址:http://cenalulu.github.io/python/gil-in-python/ GIL是什么 GIL(Global Interprete ...
- Python多线程同步互斥锁
接着上篇多线程继续讲,上篇最后的多线程共享全局变量对变量的处理值出错在本文中给出解决方案. 出现这个情况的原因是在python解释器中GIL全局解释器锁. GIL:全局解释器锁,每个线程在执行的过程都 ...
- python多线程、线程锁
1.python多线程 多线程可以把空闲时间利用起来 比如有两个进程函数 func1.func2,func1函数里使用sleep休眠一定时间,如果使用单线程调用这两个函数,那么会顺序执行这两个函数 也 ...
- python 多线程、线程锁、事件
1. 多线程的基本使用 import threading import time def run(num): print('Num: %s'% num) time.sleep(3) if num == ...
- python 多线程与GIL
GIL 与 Python 线程的纠葛 GIL 是什么?它对 python 程序会产生怎样的影响?我们先来看一个问题.运行下面这段 python 代码,CPU 占用率是多少? # 请勿在工作中模仿,危险 ...
随机推荐
- javaScript事件onmouseout 、 onmouseove
javaScript事件onmouseout . onmouseove onmouseout: 鼠标从某元素移开 onmouseover: 鼠标被移到某元素之上 这两个事件是鼠标滑过元素是的效果,可以 ...
- PVE设置屏幕休眠和笔记本合盖不休眠
注意源文件中的命令前的#号要删除. 二.屏幕休眠
- Linux系统管理实战-软件包管理
软件包管理 在Linux中,不同的发行版软件管理的方式可能不一样,具体来说,主要分为两大派: RPM: Rpm Package Manager CentOS系统软件安装三种方式 rpm:安装简单,可定 ...
- 使用SecureCRT通过SSH连接远程Linux设备
Ubuntu安装和配置ssh教程 https://blog.csdn.net/future_ai/article/details/81701744 以SecureCRT为例: 把电脑和设备连接在同一个 ...
- IT工具知识-08:如何使用Openwrt下的SMB服务(第一次使用时)?
0.背景知识 使用固件:Lean的R20.5.9由flippy打包 需要软件:ssh客户端(我用的xshell),浏览器(最好是chrome内核) 1.使用教程 1.1 注释掉SAMBA模板中的某条指 ...
- php上传文件时出现 caution: request is not finished yet
其中的一个原因:是wamp64下的tmp文件夹中的临时文件太多,把这个文件夹的临时文件清理后就可以了.
- SQL SERVER 2014 双机热备操作流程-数据库双向同步 (第二篇:订阅)
1.登录从服务器数据库,从数据库左侧菜单栏找到->复制->本地订阅->右击新建订阅->选择查找SQL Server 发布服务器,数据库服务器名称要是主服务器计算机名称,输入登录 ...
- WPF中的DataGrid支持Excell粘贴数据
其中XMAL文件中的表格样式: <DataGrid x:Name="DataListView" AutoGenerateColumns="False" H ...
- Python使用Eel和HTML开发桌面应用GUI直接用web前端的VUE+VANT来做
python的gui太难用了,唯一能配置独立前端的程序只有web.所以用web做前端,到python,完美! 环境准备 Python 3.9 Chrome浏览器(由于Eel是直接调用的Ch ...
- Repeater 绑定数据是根据数据修改行的颜色值信息
<ItemTemplate> <tr <%# Eval("dayu20").ToString()=="0"? "style=' ...