当前位置: 首页 > news >正文

php做网站难么/搜索网站大全

php做网站难么,搜索网站大全,专业网站建设常州,胶南网站建设公司先看一道GIL面试题:描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。GIL:又叫全局解释器锁,每个线…

先看一道GIL面试题:

描述Python GIL的概念, 以及它对python多线程的影响?编写一个多线程抓取网页的程序,并阐明多线程抓取程序是否可比单线程性能有提升,并解释原因。

GIL:又叫全局解释器锁,每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行,目的是解决多线程同时竞争程序中的全局变量而出现的线程安全问题。它并不是python语言的特性,仅仅是由于历史的原因在CPython解释器中难以移除,因为python语言运行环境大部分默认在CPython解释器中。

通过一个案例了解单线程和多线程的cpu占用率:

打开Ubuntu终端命令:输入htop,回车,红色箭头指向的2代表此时我的虚拟机中CPU有两个核心数

d14c6f1fc4cd5d4fffde9e0962291dd2.png

下面通过一个案例了解单线程死循环和多线程死循环的CPU占用率:

单线程死循环.py:

#coding=utf-8

while True:

pass

运行该程序,出现以下界面:

8e733abee3b71442d682e59da0b62094.gif

此时新开一个窗口,输入htop,查看CPU占用率,其中一个CPU占用率几乎为100%:

8cc000c91ed64e450d9c114af8d9046b.gif

两个线程死循环.py

#coding=utf-8

import threading

#子线程死循环

def test():

while True:

pass

t1=threading.Thread(target=test)

t1.start()

#主线程死循环,

while True:

pass

此时新开一个终端,输入htop查看CPU占用率,可以看到两个CPU任何一个并没有全部占满,而是交替执行的:

a8ae9ab09cd53001295082ef9e7dfb14.gif

这也就验证了多线程下每个线程在执行的过程中都需要先获取GIL,保证同一时刻只有一个线程在运行。

由于GIL的存在,即使是多线程,事实上同一时刻只能保证一个线程在运行,既然这样多线程的运行效率不就和单线程一样了吗,那为什么还要使用多线程呢?

由于以前的电脑基本都是单核CPU,多线程和单线程几乎看不出差别,可是由于计算机的迅速发展,现在的电脑几乎都是多核CPU了,最少也是两个核心数的,这时差别就出来了:通过之前的案例我们已经知道,即使在多核CPU中,多线程同一时刻也只有一个线程在运行,这样不仅不能利用多核CPU的优势,反而由于每个线程在多个CPU上是交替执行的,导致在不同CPU上切换时造成资源的浪费,反而会更慢。即原因是一个进程只存在一把gil锁,当在执行多个线程时,内部会争抢gil锁,这会造成当某一个线程没有抢到锁的时候会让cpu等待,进而不能合理利用多核cpu资源。

例如在使用多线程抓取网页内容时,遇到IO阻塞时,正在执行的线程会暂时释放GIL锁,这时其它线程会利用这个空隙时间,执行自己的代码,因此多线程抓取比单线程抓取性能要好。

说到在这里要先介绍两个概念:计算密集型和IO密集型

计算密集型:要进行大量的数值计算,例如进行上亿的数字计算、计算圆周率、对视频进行高清解码等等。这种计算密集型任务虽然也可以用多任务完成,但是花费的主要时间在任务切换的时间,此时CPU执行任务的效率比较低。

IO密集型:涉及到网络请求(time.sleep())、磁盘IO的任务都是IO密集型任务,这类任务的特点是CPU消耗很少,任务的大部分时间都在等待IO操作完成(因为IO的速度远远低于CPU和内存的速度)。对于IO密集型任务,任务越多,CPU效率越高,但也有一个限度。

解决GIL问题的方案:

1.使用其它语言,例如C,Java

2.使用其它解释器,如java的解释器jython

3.使用多进程

线程释放GIL锁的情况:

1.在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL。

2.Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100。

GIL面试题参考答案:

Python语言和GIL没有什么关系。仅仅是由于历史原因在Cpython虚拟机(解释器),难以移除GIL。

GIL:全局解释器锁。每个线程在执行的过程都需要先获取GIL,保证同一时刻只有一个线程可以执行代码。

线程释放GIL锁的情况: 在IO操作等可能会引起阻塞的system call之前,可以暂时释放GIL,但在执行完毕后,必须重新获取GIL Python 3.x使用计时器(执行时间达到阈值后,当前线程释放GIL)或Python 2.x,tickets计数达到100。

Python使用多进程是可以利用多核的CPU资源的。

多线程爬取比单线程性能有提升,因为遇到IO阻塞会自动释放GIL锁。

到此这篇关于详解Python中的GIL(全局解释器锁)详解及解决GIL的几种方案的文章就介绍到这了,更多相关Python GIL全局解释器锁内容请搜索云海天教程以前的文章或继续浏览下面的相关文章希望大家以后多多支持云海天教程!

http://www.jmfq.cn/news/5179429.html

相关文章:

  • 网站建设安排/免费优化
  • 做外贸女装有哪些网站有哪些/关联词有哪些三年级
  • 那个网站做效果图电脑配置/网站搜索排名优化价格
  • 福州网络营销推广申请/百度推广怎么优化
  • 免费申请logo/百度seo网站优化 网络服务
  • 益阳网站开发公司/seo外链建设的方法
  • 阿里云域名如何做网站/关键词在线听免费
  • 做花语的网站/今日新闻热点10条
  • 网站空间下载/aso优化师
  • 庄河网站建设公司/安徽网站关键字优化
  • 英文网站制作注意点/优化软件刷排名seo
  • 长沙做网站排名/外贸网站平台有哪些
  • iis网站服务器安全隐患分析/网站服务器一年的费用
  • 建网站哪家好案例/hao123上网从这里开始官方
  • 标准网站建设哪家便宜/百度推广优化公司
  • 信阳市住房和城乡建设厅网站/推广赚佣金的软件排名
  • 建设专业网站价格/网店运营入门基础知识
  • 西安专题门户响应式网站建设/广告电话
  • 网站后台无法修改/中央常委成员名单
  • 网站模板没有html文件下载/英语培训
  • 微网站如何做微信支付/网络营销推广策划
  • 网页设计师联盟官网/网站seo案例
  • 郑州网站建设制作/活动营销方案
  • 福州做彩票app网站/公众号软文是什么意思
  • 网站建设规划设计公司/全网营销系统怎么样
  • 国外设计网站dooor/今天晚上19点新闻联播直播回放
  • 创建网站用突唯阿做响应式网站/竞价托管多少钱
  • cba目前排名/seo教程技术
  • phpcms v9网站建设/有哪些平台可以免费发广告
  • 用jsp做的购物网站/网站搭建步骤