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」标签,已有 31 位童鞋阅读过。

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

相关文章

你可能感兴趣的:(python,gil锁对多进程有影响吗)