码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之回调机制

时间:2020-06-21 23:30:26      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:length   download   一个   start   down   file   tac   load()   rdo   

# 回调模式:把函数作为参数,传递给另一个函数,延迟到另一个函数的某个时刻执行的过程叫回调。
# 缺点:回调地狱
# 面向过程的实现方式
def callback(*args, **kwargs):
    """回调函数"""
    # TODO 函数体的实现
    pass


def otherFunc(func. *args, **kwargs):
    """高阶函数,也叫包含函数"""
    # TODO 函数体的实现
    pass


# 面向对象的实现方式:策略模式
from abc import ABCMeta, abstractmethod


class Strategy(metaclass=ABCMeta):
    """算法的抽象类"""
    @abstractmethod
    def algorithm(self, *args, **kwargs):
        """定义算法"""
        pass


class StrategyA(Strategy):
    """策略A"""
    def algorithm(self, *args, **kwargs):
        print("算法A的实现")


class StrategyB(Strategy):
    """策略A"""
    def algorithm(self, *args, **kwargs):
        print("算法A的实现")


class Context:
    """上下文环境类"""
    def interface(self, strategy, *args, **kwargs):
        """交互接口"""
        print("回调执行前的操作")
        strategy.algorithm()
        print("回调执行后的操作")

# 调用方式
# context = Context()
# context.interface(StrategyA())
# context.interface(StrategyB())

# 回调在异步中的应用
# 异步的两种实现方式:多线程、多任务与事件循环

import requests
from threading import Thread

class DownloadThread(Thread):
    # 每次写文件的缓冲大小
    CHUNK_SIZE = 1024 * 512

    def __init__(self, fileName, url, savePath, callBackProgress, callBackFinished):
        super().__init__()
        self.__fileName = fileName
        self.__url = url
        self.__savePath = savePath
        self.__callBackProgress = callBackProgress
        self.__callBackFinished = callBackFinished

    def run(self):
        readSize = 0
        r = requests.get(url=self.__url, stream=True)
        totalSize = int(r.headers.get("Content-Length"))
        print("[下载%s] 文件大小:%d" % (self.__fileName, totalSize))
        with open(self.__savePath, "wb") as file:
            for chunk in r.iter_content(chunk_size=self.CHUNK_SIZE):
                if chunk:
                    file.write(chunk)
                    readSize += self.CHUNK_SIZE
                    self.__callBackProgress(self.__fileName, readSize, totalSize)
        self.__callBackFinished(self.__fileName)


def testDownload():
    def downloadProgress(fileName, readSize, totalSize):
        """"定义下载进度的回调函数"""
        percent = (readSize / totalSize) * 100
        print("[下载5s] 下载进度:%.2f%%" % (fileName, percent))

    def downloadFinished(filename):
        """定义下载完成后的回调函数"""
        print("[下载%s] 文件下载完成!" % fileName)

    
    print("开始下载TestForDownload1.pdf......")
    downloadUrl1 = ""
    download1 = DownloadThread("TestForDownload1", downloadUrl1, "./download.TestForDownload1.pdf", downloadProgress, downloadFinished)
    download1.start()
    print("开始下载TestForDownload2.pdf......")
    downloadUrl2 = ""
    download2 = DownloadThread("TestForDownload2", downloadUrl2, "./download.TestForDownload2.pdf", downloadProgress, downloadFinished)
    download2.start()

    # 执行其他任务

 

设计模式之回调机制

标签:length   download   一个   start   down   file   tac   load()   rdo   

原文地址:https://www.cnblogs.com/loveprogramme/p/13174352.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!