3.并行、并发、串行

目录

一、串行

二、并行

三、并发


一、串行

串行,代码从上往下按照顺序执行。如果串行,一个队列使用一台咖啡机,那么哪怕前面那个人便秘了去厕所呆半天,后面的人也只能死等着他回来才能去接咖啡,这效率无疑是最低的
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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘缘浮梦

你的鼓励将是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值