多任务:
提高效率
进程:
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