目录
一、串行
串行,代码从上往下按照顺序执行。如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的。
sum = 0
"""
串行,代码从上往下按照顺序执行
"""
def cal_number(number):
global sum
for i in range(number):
sum += i
print(sum)
if __name__ == '__main__':
cal_number(10)
二、并行
并行是两个队列同时使用两台可乐机。
并行(Parallel)系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行。
多进程实现并行。
import multiprocessing
from concurrent.futures import ProcessPoolExecutor
import time
cpu_count = multiprocessing.cpu_count()
max_count = cpu_count - 1
print(max_count)
def task(i):
time.sleep(1)
print('进程池最大个数为CPU核数-1', i)
if __name__ == '__main__':
pool = ProcessPoolExecutor(max_count)
for i in range(max_count):
pool.submit(task, i)
print('主线程占用一个cpu')
三、并发
并发是两个队列交替使用一台可乐机。
并发(concurrency)指计算机似乎同时在做很多事情。例如对于单CPU机器,操作系统会在各个程序之间进行快速的切换,达到多个程序同时执行的假象。
在python的原始解释器CPython中存在着GIL(Global Interpreter Lock,全局解释器锁),这就导致了虽然是多线程的,但是一个时间只有一个线程在占用解释器。
因此Python中的多线程是真实的并发,即使拥有多个CPU也没法充分利用。因此仅仅适用于IO密集型任务,对于CPU密集型不适用。
img.txt
weiwei,https://lmg.jj20.com/up/allimg/4k/s/02/210924224R45162-0-lp.jpg
jiangge,https://up.enterdesk.com/edpic_source/aa/9f/af/aa9faf91f2c01c02cf216fd24c1705de.jpg
huanrong,https://img.tukuppt.com/photo-big/00/01/77/618c7528d1be37922.jpg
xiaohong,https://up.enterdesk.com/edpic_source/ce/0c/52/ce0c5214f3741faedfdee5c69ee513bc.jpg
damei,https://up.enterdesk.com/edpic_source/b9/4a/e9/b94ae9e9f03d895eeadf5e0f9f210382.jpg
import requests
from concurrent.futures import ThreadPoolExecutor
def download(image_url):
res = requests.get(
url=image_url,
headers={
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36"
}
)
return res
def flie_name_param(file_name):
def save_img(response):
res = response.result()
# 将下载的图片的内容写入到文件
with open(file_name, mode='wb') as f:
f.write(res.content)
return save_img
pool = ThreadPoolExecutor(7)
with open("img.txt", mode='r', encoding='utf-8') as f:
for line in f:
name, url = line.split(',')
file_name = "{}.jpg".format(name).strip()
url = url.strip()
fur = pool.submit(download, url)
# 回调,通过闭包的方式传递参数
fur.add_done_callback(flie_name_param(file_name))