python3爬虫GIL修改多线程实例讲解
作者:小妮浅浅 发布时间:2023-06-09 22:33:58
标签:python3,GIL,多线程
我们打开程序后,会发现电脑的内存和cpu发生了变化。在对于前者上面,自然是希望内容占用小,cpu的利用越高越好。那有没有什么方法可以让我们的cpu达到满状态的运行效果呢?这就得用到我们所学的多线程中的知识了,再正式开始讲解之前,我们先来说说操作的思路吧,然后进行代码对比。
我们都知道,比方我有一个4核的CPU,那么这样一来,在单位时间内每个核只能跑一个线程,然后时间片轮转切换。但是Python不一样,它不管你有几个核,单位时间多个核只能跑一个线程,然后时间片轮转。看起来很不可思议?但是这就是GIL搞的鬼。任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。通常我们用的解释器是官方实现的CPython,要真正利用多核,除非重写一个不带GIL的解释器。我们不妨做个试验:
#coding=utf-8
from multiprocessing import Pool
from threading import Thread
from multiprocessing import Process
def loop():
while True:
pass
if __name__ == '__main__':
for i in range(3):
t = Thread(target=loop)
t.start()
while True:
pass
我的电脑是4核,所以我开了4个线程,看一下CPU资源占有率:
我们发现CPU利用率并没有占满,大致相当于单核水平。
而如果我们变成进程呢?
我们改一下代码:
#coding=utf-8
from multiprocessing import Pool
from threading import Thread
from multiprocessing import Process
def loop():
while True:
pass
if __name__ == '__main__':
for i in range(3):
t = Process(target=loop)
t.start()
Pass
结果直接飙到了100%,说明进程是可以利用多核的!
来源:https://www.py.cn/jishu/jichu/21183.html


猜你喜欢
- QSS介绍前言QSS即Qt样式表,是用来自定义控件外观的一种机制,QSS大量参考了Css的内容,但QSS的功能要比Css弱得多,体现在选择器
- 六步安装Mysql(免安装包的才可以选安装位置),供大家参考,具体内容如下第一步:下载MySQL压缩包mysql下载路径直接点击链接也可以下
- 密码算法程序设计实践选的SHA-1。在写的过程中遇到一丢丢关于python移位的问题,记录一下。SHA-1其中第一步需要填充消息。简单阐述一
- 一、概述及完整代码对MNIST(MixedNational Institute of Standard and Technology dat
- 模块概述如果说模块是按照逻辑来组织 Python 代码的方法, 那么文件便是物理层上组织模块的方法。 因此, **一个文件被看作是一个独立模
- 前言和网络 IO 一样,文件读写同样是一个费事的操作。默认情况下,Python 使用的是系统的阻塞读写。这意味着在 asyncio 中如果调
- 在网络设计领域关于Eye-Tracking的研究十分火爆,但是如何把这些研究结果转变为具体可行的设计来运作依旧是个难点。以下就是一些来自于E
- 前言本博客重点内容:reportlab生成流文件格式、reportlab分页和图片流文件写入reportlab等。我讲一下我这个需求的来源,
- 1、PyInstaller简介PyInstaller是一个跨平台的Python应用打包工具,支持 Windows/Linux/MacOS三大
- 对匿名用户采用 IP 控制访问频率,对登录用户采用 用户名 控制访问频率。from rest_framework.throttling im
- 记录一下:# Three loss functionscategory_predict1 = Dense(100, activation=&
- 这篇文章主要介绍了Python3打包exe代码2种方法实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- 原理:建立一个任务队列,然多个线程都从这个任务队列中取出任务然后执行,当然任务队列要加锁,详细请看代码import threadingimp
- 说明之前下载来zip包的漫画,里面的图片都是两张一起的:但是某些漫画查看软件不支持自动分屏,看起来会比较不舒服,所以只能自己动手来切分。操作
- 虽然 prometheus 已有大量可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。例如,node exporte
- 本文实例讲解了JavaScript实现简单的tab选项卡切换的示例代码,分享给大家供大家参考,具体内容如下效果图:具体代码:<!DOC
- 前言在 Go 单元测试这个系列的第二部分 数据库的Mock测试 中我们介绍了用 go-sqlmock 给数据库的 CRUD 操作做Mock
- 目的把字符串逐字符或逐词反转过来,这个蛮有意思的。方法先看逐字符反转吧,第一种设置切片的步长为-1revchars=astring[::-1
- 对于题目中提出的问题,可以拆分来一步步解决。在 MySQL 中 KEY 和 INDEX 是同义。那这个问题就可以简化为 PRIMARY KE
- 我们都知道 vue 中可以使用 modal 来实现 input 内容数据的双向绑定。小程序好像没有提供相应的方法支持,就需要我们自己写了。原