python gil锁对多线程影响_python-GIL锁介绍进程线程效率比较

"""

原理剖析:http://c.biancheng.net/view/5537.html

GIL的功能是:在CPython解释器中执行的每一个Python线程,都会先锁住自己(线程),以阻止别的线程执行。

在cpython解释器中,同一个进程下开启的多线程,同一个时间只能有一个线程执行,无法利用多核优势。

也就是说由于全局解释器锁(GIL)的原因,cpython没有真正意义上的多线程

"""

# IO密集型适合多线程

# 计算密集型适合多进程

from multiprocessing import Process

from threading import Thread

import os

import time

########################################################################

# 计算密集型

# def work():

# res = 1

# for i in range(100000000):

# res *= i

# return res

#

#

# if __name__ == '__main__':

# print("cpus", os.cpu_count())

# start_time = time.time()

# l = []

# # 将计算任务,用多进程和多线程运行4次的时间比较

# for i in range(4):

# # 4个进程基本同时运行(cpu支持数量),单进程运行需要4s,所以总时间在4s多一点,因为同一时间有4个进程同时运行

# # w = Process(target=work) # 运行时间4.5s

#

# # 4个线程并发执行,每个线程之间由于有GIL锁的原因,线程会来回切换,实际上同一时间只有一个线程在执行。

# # 由于cpu计算的时候并没有同时计算,所以单线程4s,4线程需要16s多一点

# w = Thread(target=work) # 运行时间16.3s

# l.append(w)

# w.start()

#

# for i in l:

# i.join()

#

# print('运行结束%s' % (time.time() - start_time))

########################################################################

# IO密集型

def work():

time.sleep(2)

if __name__ == '__main__':

print("cpus", os.cpu_count())

start_time = time.time()

l = []

# 将IO任务,用多进程和多线程运行400次的时间比较

for i in range(400): # 开启的数量越多,进程和线程的差距越明显

# 开启400个进程,子进程需要复制主进程的资源,复制是有损耗的,所以单次运行时间是2秒,加上损耗将近1秒

w = Process(target=work) # 运行时间2.99s

# 开启400个线程,线程的资源是共享主线程的,因为没有涉及到计算,运行时间取决于IO时间

# 所以单次运行时间是2s,总时间在2s多一点

# w = Thread(target=work) # 运行时间2.02s

l.append(w)

w.start()

for i in l:

i.join()

print('运行结束%s' % (time.time() - start_time))

最后更新于 2020-12-22 02:59:02 并被添加「python」标签,已有 55 位童鞋阅读过。

本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

相关文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值