GIL的问题

多任务:
  提高效率
  
进程:
  Process
  Pool
线程:
  Thread
  子类(Thread)

python中的多线程
其实是:
  伪多线程(查资料)

由于GIL(全局解释器锁)的存在,导致Python中即使开启多线程处理,也无法发挥多核优势

任务分类:
  1.CPU密集型
    涉及到计算的,都可以算是CPU密集型
  需使用多进程
  使用多进程,需要if _name_ == “__main__”:
  
  2.IO密集型
    涉及到阻塞的,都可以算是IO密集型
  需使用多线程

练习1:
常规方式(涉及到计算:j += 1,属于CPU密集型):  
使用单线程

import time
def task1():
	start_time = time.time()
	j = 0
	for i in range(10000000):
    	j += 1
	end_time = time.time()
	print('耗时:{}秒'.format(end_time-start_time))
	
# 2s左右

如果使用多线程:

def task2(threadName):
	start_time = time.time()
	j = 0
	for i in range(5000000):
    	j += 1
	end_time = time.time()
	print('耗时:{}'.format(end_time - start_time))
	
for i in range(1,3):
	t = threading.Thread(target=task2,args=('线程{}'.format(i),))
	t.start()
	
# 同时开启两个线程执行,耗时也是2s左右

如果使用多进程?

    def task2(threadName):
		start_time = time.time()
		j = 0
		for i in range(5000000):
    		j += 1
		end_time = time.time()
		print('耗时:{}'.format(end_time - start_time))
		
	if __name__ == '__main__':
		p = multiprocessing.Pool(4)
		for i in range(1,3):
			p.apply_async(task2, args=('进程{}'.format(i),))
		p.close()
		p.join()
		
	# 耗时只有 0.5s 左右

练习2:
IO密集型(涉及到休眠等阻塞的)
如果常规方式:(顺序执行)

import time

def download1():
	for i in range(1, 11):
		print(f'任务1下载进行{i*10}%')
		time.sleep(0.2)
		
def download2():
	for i in range(1, 11):
		print(f'任务2下载进行{i*10}%')
		time.sleep(0.2)

start = time.time()
download1()
download2()
end = time.time()
print("耗时:{}".format(start - end))

# 4s

如果使用多线程?

import time

def download1():
	for i in range(1, 11):
		print(f'任务1下载进行{i*10}%')
		time.sleep(0.2)
		
def download2():
	for i in range(1, 11):
		print(f'任务2下载进行{i*10}%')
		time.sleep(0.2)
		
t1 = threading.Thread(target=download1)
t2 = threading.Thread(target=download2)
t1.start()
t2.start()

# 2s

如果使用多进程?

import time

def download1():
	for i in range(1, 11):
		print(f'任务1下载进行{i*10}%')
		time.sleep(0.2)
		
def download2():
	for i in range(1, 11):
		print(f'任务2下载进行{i*10}%')
		time.sleep(0.2)
		
if __name__ == '__main__':
	p1 = multiprocessing.Process(target=download1)
	p2 = multiprocessing.Process(target=download2)
	p1.start()
	p2.start()
	
# 2s
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值