SimPy源码中的精妙设计:Python生成器与事件驱动的完美结合

simpy学习(一) simpy是一个基于离散事件的Python方针框架。 安装 pip install simpy environment simpy.Environment.process - 添加仿真进程 simpy.Environment.event - 创建事件 simpy.Environment.timeout - 提供延时(timeout)事件 simpy.Environment.until - 仿真结束的条件(时间或事件) simpy.Environment.run - 仿真启动 simpy.Environme 阅读详情

## 引言:小而美的设计典范

SimPy的源码仅有几千行,却蕴含着多个精妙的代码设计。这些设计不仅体现了Python语言的优雅特性,更展示了如何在有限的代码量中实现强大的功能。本文将深入分析SimPy源码中的几个有意思的设计模式。

设计一:生成器协程 - 仿真引擎的核心

SimPy的革命性设计

SimPy 3的最大突破是完全基于Python生成器(Generator)实现协程式并发控制。这个设计让SimPy能够以极低的开销管理成百上千个并发进程。

源码解析

def clock(env, name, tick):
    while True:
        print(name, env.now)
        yield env.timeout(tick)

这个看似简单的函数背后,隐藏着SimPy的核心设计哲学:

1. 生成器作为协程

class Process(Event):
    def __init__(self, env, generator):
        self._generator = generator
        self._target = None
        env.schedule(self)

    def _desc(self):
        return f'{self._generator.__name__}'

    def _callback(self, event):
        try:
            result = self._generator.send(event.value)
            if isinstance(result, Event):
                result._add_callback(self._callback)
            else:
                raise RuntimeError(f'Process {self} yielded invalid event {result}')
        except StopIteration as e:
            self.succeed(e.value)
        except BaseException as e:
            self.fail(e)

设计亮点:

  • 零线程开销:使用生成器实现协程,避免了操作系统级线程的开销
  • 显式挂起点:通过yield明确标记进程的挂起点,代码逻辑清晰
  • 自动调度:进程在yield时自动交出控制权,环境负责调度下一个进程

2. yield from的巧妙运用

def complex_operation(env, duration):
    yield from setup_phase(env, duration/3)
    yield from processing_phase(env, duration/3)
    yield from cleanup_phase(env, duration/3)

def setup_phase(env, duration):
    print(f"Time {env.now}: Setup phase started")
    yield env.timeout(duration)
    print(f"Time {env.now}: Setup phase completed")

设计亮点:

  • 代码复用:可以将多个yield操作封装成函数
  • 模块化设计:每个阶段独立封装,易于测试和维护
  • 语义清晰:yield from明确表达了"委托执行"的语义

设计二:堆队列 - 高效的事件调度器

问题背景

离散事件仿真的核心是事件调度。如何高效地管理大量事件,并在O(1)时间内找到下一个要执行的事件?

SimPy的解决方案

SimPy使用Python标准库的heapq模块实现事件队列:

import heapq

class Environment:
    def __init__(self):
        self._queue = []
        self._eid = 0

    def schedule(self, event, delay=0):
        self._eid += 1
        heapq.heappush(self._queue, (self.now + delay, self._eid, event))

    def step(self):
        time, eid, event = heapq.heappop(self._queue)
        self._now = time
        event._process()

设计亮点

1. 时间复杂度优化

操作普通列表堆队列
插入事件O(1)O(log n)
查找最早事件O(n)O(1)
删除最早事件O(n)O(log n)

2. 事件ID的设计 - 解决同时事件问题

heapq.heappush(self._queue, (time, eid, event))

问题:如果两个事件同时发生(time相同),如何确定执行顺序?

解决方案:引入严格递增的事件ID(eid)

  • 第一个事件:(10.0, 1, event1)
  • 第二个事件:(10.0, 2, event2)

当time相同时,Python会比较元组的下一个元素eid,从而保证FIFO(先进先出)顺序。

设计哲学:

  • 确定性:相同的输入总是产生相同的输出
  • 可预测性:事件执行顺序完全可预测
  • 简单性:利用Python元组比较的特性,无需额外代码

设计三:回调机制 - 事件驱动的精髓

设计模式

SimPy的事件系统采用了观察者模式(Observer Pattern)的变体:

class Event:
    def __init__(self, env):
        self.env = env
        self.callbacks = []
        self._value = None
        self._ok = None
        self._defused = False

    def _add_callback(self, callback):
        if self._ok is None:
            self.callbacks.append(callback)
        else:
            callback(self)

    def _process(self):
        for callback in self.callbacks:
            callback(self)

设计亮点

1. 延迟执行

def _add_callback(self, callback):
    if self._ok is None:  # 事件未触发
        self.callbacks.append(callback)
    else:  # 事件已触发
        callback(self)  # 立即执行

设计哲学:

  • 灵活性:无论事件是否已触发,都能正确添加回调
  • 一致性:回调的执行时机对调用者透明
  • 避免竞态条件:不需要担心事件在添加回调时被触发

2. 链式回调

def customer(env, counter):
    with counter.request() as req:
        yield req  # 等待资源
        yield env.timeout(5)  # 服务5分钟
        print(f'服务完成 at {env.now}')

内部实现:

class Process(Event):
    def _callback(self, event):
        try:
            result = self._generator.send(event.value)
            if isinstance(result, Event):
                result._add_callback(self._callback)  # 链式注册
        except StopIteration:
            self.succeed()

设计亮点:

  • 自动链接:进程自动等待下一个事件
  • 无限链式:可以链接任意数量的事件
  • 异常处理:通过try-except捕获生成器的结束和异常

设计四:上下文管理器 - 优雅的资源管理

设计模式

SimPy使用Python的上下文管理器(Context Manager)模式管理资源:

class Resource:
    def request(self, priority=0, preempt=True):
        return Request(self, priority, preempt)

class Request:
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        if self._proc is not None:
            self.resource.release(self)
        return False

使用示例

def customer(env, counter):
    with counter.request() as req:
        yield req
        yield env.timeout(5)
    # 自动释放资源

设计亮点

1. 异常安全

def customer(env, counter):
    with counter.request() as req:
        yield req
        if some_condition:
            raise Exception('Something went wrong')
        yield env.timeout(5)
    # 即使抛出异常,资源也会被释放

2. 代码简洁

对比传统方式:

def customer(env, counter):
    req = counter.request()
    yield req
    try:
        yield env.timeout(5)
    finally:
        counter.release(req)

使用上下文管理器后:

def customer(env, counter):
    with counter.request() as req:
        yield req
        yield env.timeout(5)

设计哲学:

  • RAII原则:Resource Acquisition Is Initialization
  • 自动化管理:资源生命周期由语言特性保证
  • 可读性:代码意图更加清晰

设计五:事件状态机 - 清晰的生命周期

状态设计

SimPy的事件采用有限状态机设计:

class Event:
    def __init__(self, env):
        self.env = env
        self._ok = None  # None: untriggered, True: succeeded, False: failed
        self._value = None
        self.callbacks = []

    def succeed(self, value=None):
        if self._ok is not None:
            raise RuntimeError('Event has already been triggered')
        self._ok = True
        self._value = value
        self.env.schedule(self)

    def fail(self, exception):
        if self._ok is not None:
            raise RuntimeError('Event has already been triggered')
        self._ok = False
        self._value = exception
        self.env.schedule(self)

    def _process(self):
        for callback in self.callbacks:
            callback(self)

状态转换图

untriggered (_ok=None)
    |
    +-- succeed() --> triggered (_ok=True)
    |                      |
    |                      +-- _process() --> processed
    |
    +-- fail() --------> triggered (_ok=False)
                           |
                           +-- _process() --> processed

设计亮点

1. 三态设计

  • untriggered:事件尚未发生
  • triggered:事件已发生,等待处理
  • processed:事件已处理完成

2. 单一标志位

使用_ok一个变量表示三种状态:

  • None:untriggered
  • True:succeeded
  • False:failed

设计哲学:

  • 极简主义:用最少的变量表达最多的状态
  • 不可变性:事件一旦触发,状态不可更改
  • 明确性:状态转换规则清晰明确

设计六:进程与环境的解耦 - 灵活的架构

SimPy 2的问题

class MyProcess(Process):
    def __init__(self, sim):
        super().__init__(sim=sim)
        self.sim = sim

    def run(self):
        yield hold, self, 10

问题:

  • 进程必须继承Process类
  • 进程必须持有Simulation实例
  • 代码耦合度高

SimPy 3的改进

def my_process(env):
    yield env.timeout(10)

改进:

  • 进程可以是任意生成器函数
  • 环境通过参数传递
  • 完全解耦

设计哲学

1. 依赖注入

def customer(env, counter, service_time):
    with counter.request() as req:
        yield req
        yield env.timeout(service_time)

env = simpy.Environment()
counter = simpy.Resource(env, capacity=1)
env.process(customer(env, counter, 5))

优势:

  • 可测试性:可以轻松mock依赖
  • 灵活性:可以在不同环境中重用进程
  • 清晰性:依赖关系明确

2. 单一职责

  • Environment:负责时间管理和事件调度
  • Process:负责进程生命周期管理
  • Resource:负责资源分配和排队

设计七:事件组合 - 强大的并发控制

设计模式

SimPy支持事件的组合操作,实现了组合模式(Composite Pattern):

class AllOf(Event):
    def __init__(self, env, events):
        super().__init__(env)
        self._events = events
        self._remaining = len(events)
        
        for event in events:
            event._add_callback(self._check)

    def _check(self, event):
        self._remaining -= 1
        if self._remaining == 0:
            self.succeed([e.value for e in self._events])

class AnyOf(Event):
    def __init__(self, env, events):
        super().__init__(env)
        self._events = events
        
        for event in events:
            event._add_callback(self._trigger)

    def _trigger(self, event):
        if self._ok is None:
            self.succeed(event.value)

使用示例

event1 = env.timeout(5)
event2 = env.timeout(10)

yield event1 & event2  # 等待所有事件
yield event1 | event2  # 等待任一事件

设计亮点

1. 运算符重载

class Event:
    def __and__(self, other):
        return AllOf(self.env, [self, other])

    def __or__(self, other):
        return AnyOf(self.env, [self, other])

设计哲学:

  • 直观性:使用&和|运算符,语义清晰
  • 可组合性:事件可以任意组合
  • 扩展性:可以定义新的组合方式

2. 惰性求值

def _check(self, event):
    self._remaining -= 1
    if self._remaining == 0:
        self.succeed([e.value for e in self._events])

设计哲学:

  • 效率:只在所有事件完成时才触发
  • 内存友好:不需要存储中间结果
  • 实时性:事件完成时立即检查

设计八:中断机制 - 优雅的异常处理

设计模式

SimPy使用Python的异常机制实现进程中断:

class Process(Event):
    def interrupt(self, cause=None):
        if self._ok is not None:
            raise RuntimeError('Process has already terminated')

        self._target.fail(Interrupt(cause))
        self._target = None

class Interrupt(Exception):
    def __init__(self, cause):
        self.cause = cause

使用示例

def worker(env):
    try:
        yield env.timeout(10)
        print('工作完成')
    except simpy.Interrupt as interrupt:
        print(f'工作被中断: {interrupt.cause}')

def interrupter(env, worker):
    yield env.timeout(5)
    worker.interrupt('紧急任务')

env = simpy.Environment()
proc = env.process(worker(env))
env.process(interrupter(env, proc))
env.run()

设计亮点

1. 利用语言特性

SimPy巧妙地利用Python的异常机制实现中断:

try:
    yield env.timeout(10)
except simpy.Interrupt:
    # 处理中断

设计哲学:

  • 自然性:中断就是异常,语义一致
  • 强制性:中断可以打断任何等待中的进程
  • 可控性:进程可以选择捕获或忽略中断

2. 清理资源

def worker(env, resource):
    with resource.request() as req:
        try:
            yield req
            yield env.timeout(10)
        except simpy.Interrupt:
            print('被中断,资源自动释放')
            # with语句确保资源被释放

设计九:实时仿真 - 时间同步的艺术

设计模式

SimPy通过继承实现实时仿真:

class RealtimeEnvironment(Environment):
    def __init__(self, initial_time=0, factor=1.0, strict=True):
        super().__init__(initial_time)
        self.factor = factor
        self.strict = strict

    def step(self):
        time, eid, event = self._queue[0]
        delay = time - self._now
        
        if delay > 0:
            real_delay = delay * self.factor
            time.sleep(real_delay)
        
        super().step()

设计亮点

1. 继承复用

class RealtimeEnvironment(Environment):
    def step(self):
        # 添加实时等待逻辑
        super().step()  # 复用父类的调度逻辑

设计哲学:

  • 开闭原则:对扩展开放,对修改关闭
  • 代码复用:复用Environment的核心逻辑
  • 灵活性:可以轻松添加新的仿真模式

2. 时间缩放

real_delay = delay * self.factor

应用场景:

  • factor=1.0:实时仿真
  • factor=0.1:加速仿真(1秒仿真时间=0.1秒真实时间)
  • factor=10.0:慢放仿真(1秒仿真时间=10秒真实时间)

设计十:监控与调试 - 可观测性设计

设计模式

SimPy通过事件回调实现监控:

class Monitor:
    def __init__(self, env):
        self.env = env
        self.data = []

    def trace(self, event):
        def callback(event):
            self.data.append({
                'time': self.env.now,
                'event': event,
                'value': event.value
            })
        event._add_callback(callback)
        return event

使用示例

monitor = Monitor(env)
event = monitor.trace(env.timeout(5))

设计亮点

1. 非侵入式

监控逻辑完全独立于业务逻辑:

# 业务逻辑
def customer(env, counter):
    with counter.request() as req:
        yield req
        yield env.timeout(5)

# 监控逻辑
monitor.trace(env.process(customer(env, counter)))

设计哲学:

  • 关注点分离:业务逻辑与监控逻辑分离
  • 可插拔性:可以随时添加或移除监控
  • 零开销:不使用监控时,没有性能损失

2. 数据收集

class Statistics:
    def __init__(self):
        self.wait_times = []
        self.service_times = []

    def record_wait(self, wait_time):
        self.wait_times.append(wait_time)

    def record_service(self, service_time):
        self.service_times.append(service_time)

总结:设计哲学的启示

SimPy的源码设计给我们带来了多个启示:

1. 极简主义

  • 用最少的代码实现最完整的功能
  • 每个设计都有明确的目的
  • 避免过度设计

2. 语言特性的充分利用

  • 生成器实现协程
  • 上下文管理器管理资源
  • 异常机制实现中断
  • 运算符重载实现事件组合

3. 设计模式的恰当应用

  • 观察者模式:事件回调
  • 组合模式:事件组合
  • 状态模式:事件状态机
  • 策略模式:不同的仿真模式

4. 可扩展性

  • 通过继承扩展功能
  • 通过组合实现复杂逻辑
  • 通过回调实现扩展点

5. 可测试性

  • 依赖注入
  • 单一职责
  • 接口清晰

SimPy的源码是"小而美"的典范。它证明了:好的设计不需要复杂的代码,而是需要深刻的洞察和精心的设计。每一个设计决策都有其合理性,每一行代码都有其存在的价值。

这正是我们学习源码设计的意义所在:不是为了炫技,而是为了在合适的场景应用合适的设计,让代码更加优雅、高效、可维护。


更多前沿技术的文章请关注公众号“智链科技局”

利用python分离blockly源码 Blockly由超过一百个JavaScript文件组成。通过互联网加载这些对终端用户来说是一种缓慢的体验。为了使Blockly加载更快,它可以压缩到六个文件总共约150kb。 Blockly带有源代码和压缩文件,因此除非你是在,,或目录core中blocks,否则不需要构建Blockly。generatorsmsg 压缩Blockly非常简单。假设你安装了Python 2.x,只需build.py在Blockly的根目录下运行: python构建.py 此命令大约需要20秒,并使用Google的在线Clos 阅读详情

相关推荐

Python 库之SRE正则表达式 re 源码

# # Secret Labs' Regular Expression Engine # # re-compatible interface for the sre matching engine # # Copyright (c) 1998-2001 by Secret Labs AB. All rights reserved. # # This version of the SRE libr

一条野喵 6656

simpy 10 分钟简介

今天把https://simpy.readthedocs.org/en/latest/simpy_intro/index.html里的简介搬运过来。

fengyang0317的专栏 7399

(5-3)PID控制算法:自整定PID

自整定PID(Self-Tuning PID)是一种自适应控制技术,旨在使PID控制器能够根据系统的动态性质自动调整其参数,以适应不同的工作条件和变化的系统特性。自整定PID是一种能够在运行时自动调整参数的PID控制器,具有适应性强、性能优化和避免手动调参的优势,这种控制方法在工业自动化和过程控制等领域得到广泛应用。在下面列出了自整定PID的基本概念。整体而言,本实例演示了一个机器人通过PID控制器实现位置控制,并且在运动过程中动态地调整PID参数,以适应不断变化的环境或系统要求。

码农三叔 3722

数学建模竞赛Python仿真优化:SimPy离散事件仿真与代码实战

离散事件仿真(DES)是模拟随机动态系统的核心技术,其原理是通过定义实体、事件和资源,按时间顺序推进来模拟系统行为。在Python中,SimPy库提供了强大的框架,通过进程(Process)和环境(Environment)抽象,极大简化了排队系统、生产调度等复杂模型的构建。这项技术的核心价值在于,它允许我们在虚拟环境中以极低成本测试和优化现实系统,评估不同策略下的性能指标,如平均等待时间、资源利用率和吞吐量。在数学建模竞赛和工业工程领域,结合NumPy、Pandas进行数据分析和结果可视化,能够将抽象的数学

weixin_34321753的博客 336

基于Python与MySQL的简易SNMP管理站工具全解析

SNMP是网络管理中不可或缺的标准协议,用于统一采集交换机、路由器、服务器等设备的CPU、内存与接口流量等状态数据。理解OID、MIB、Community等基础概念后,可通过Python生态中的pysnmp库快速实现管理端与设备Agent的通信。结合MySQL对采集数据进行持久化,并配合前端图表展示,即可构建一套链路完整的轻量级网络监控系统。本文从工程实践角度,详细介绍基于Python+MySQL的简易SNMP管理站工具的完整设计思路,涵盖协议原理、前后端实现、数据库表结构、轮询调度与告警机制,并给出环境部

weixin_27697385的博客 274

OpenCLI入门:让任何网站变成你的命令行工具(超详细版)

最有用的工具,往往是最简单的。 opencli就是这样。 它不会帮你写代码,不会帮你做决策,但它能把200+个平台装进你的命令行。 让你用最简单的方式,获取最丰富的数据。

weixin_66295112的博客 2089

python 设计模式 23种_python实现23种设计模式

本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python参考文献:《大话设计模式》——吴强《Python设计模式》——pythontip.com《23种设计模式》——http://www.cnblogs.com/beijiguangyong/设计模式是什么?设计模式是经过总结、优化的,对我们经常会碰到的一些编程问题的可...

weixin_39842611的博客 322

卡诺图化简法

目录 1.学前需要了解知识点 2.卡诺图(karnaugh map) 3.逻辑函数的卡诺图化简法 4.总结 1.学前需要了解知识点 最小项的定义 最小项的表示方法 最小项的相邻性 最小项的定义:一个函数的某个乘积项包含了函数的全部变量,其中每个变量都以原变量或反变量的形式出现,且仅出现一次,则这个乘积项称为该函数的一个标准积项,通常称为最小项。 最小项的表示方法:通常用来表...

hahasusu的专栏 17万+

NiceGUI代码生成终极指南:如何快速构建Python Web界面的10个技巧

NiceGUI是一个能让开发者用Python快速创建Web界面的强大工具,它提供了简洁的API和丰富的组件,让即使没有前端经验的开发者也能轻松构建出美观且功能丰富的Web应用。本文将分享10个实用技巧,帮助你快速掌握NiceGUI,提升Python Web界面开发效率。 ## 一、一键安装与快速启动 要开始使用NiceGUI,首先需要进行安装。通过简单的pip命令即可完成安装: ```bas

gitblog_00449的博客 1120

从编译到启动:RV1106嵌入式Linux系统构建的效率优化与深度实践

本文深入探讨RV1106嵌入式Linux系统构建的全流程优化策略,重点提升编译速度和驱动加载效率。通过并行编译配置、内核裁剪、驱动加载优化和硬件辅助加速等实践方法,显著缩短系统构建和启动时间,为嵌入式开发提供实用指导。

ttt77的博客 1032

cdh zookeeper未授权访问(安全漏洞)处理

前言: 最近公司在做安全漏洞扫描。发现cdh zookeeper存在未授权访问的问题。 ZooKeeper的节点有5种操作权限: CREATE、READ、WRITE、DELETE、ADMIN 也就是 增、删、改、查、管理权限,这5种权限简写为crwda(即:每个单词的首字符缩写) 注:这5种权限中,delete是指对子节点的删除权限,其它4种权限指对自身节点的操作权限 ZooKeeper的身份的认证有4种方式: world:默认方式,相当于全世界都能访问 auth:代表已经认证通过的..

belialxing的专栏 2446

python源码安装make出错_【python】python2.7源码安装遇到的问题&&解决

1、Error_Info 1: INFO: Can't locate Tcl/Tk libs and/or headers1.1 解决yum install tcl-develyum install tk-devel1.2 原因参考:You may have to install Tcl and Tk(when using RPM, install the –devel RPM as well) ...

weixin_33631305的博客 1177

【数字IC设计】芯片设计中的RDC

在芯片设计中,RDC是的缩写,类似于CDC(clock domain crossing),由于现在SOC芯片是有很多ECUs组成,为了使整个系统能够快速从复位中恢复, 用户希望SOC里面每个ECU模块都可以有自己独立的异步复位信号,这样可以在出问题的时候只复位有错误逻辑的模块,而使其它模块保持正常工作。

qq_40268672的博客 2185

设计模式 —— Python版

文章目录创建型1. Factory Method(工厂方法)2. Abstract Factory(抽象工厂)3. Builder(建造者)4. Prototype(原型)5. Singleton(单例)结构型6. Adapter Class/Object(适配器)7. Bridge(桥接)8. Composite(组合)9. Decorator(装饰)10. Facade(外观)11. Flyw...

Harrytsz的博客 920

优快云 2

2

qq_62260432的博客 5236

dify进阶:使用 FastAPI 的 StreamingResponse 实现高效的数据流传输

在 FastAPI 框架中,是一个非常有用的工具,它允许你以流的方式发送数据给客户端,而不是一次性加载所有内容到内存中再发送。这对于处理大型文件下载、视频流或者任何需要长时间处理的任务特别有用。

xiezhipu的博客 1433

python类方法中的变量_深入理解Python中的ThreadLocal变量(中)

在上个文章中中我们看到 ThreadLocal 的引入,使得可以很方便地在多线程环境中使用局部变量。如此美妙的功能到底是怎样实现的?如果你对它的实现原理没有好奇心或一探究竟的冲动,那么接下来的内容估计会让你后悔自己的浅尝辄止了。 ThreadLocal 实现机制 简单来说,Python 中 ThreadLocal 就是通过下图中的方法,将全局变量伪装成线程局部变量,相信读完本篇文章你会理解图中内容...

weixin_39750854的博客 227

USB_TYPE-C 母座电路设计

本文详细介绍了USB Type-C接口(C2765186)的电路设计要点,重点解析了电源、识别和数据三部分的关键连接方案。电源部分需并联VBUS和GND引脚并加宽走线以承载3A电流;识别部分必须为CC1/CC2引脚配置5.1kΩ±1%精度的下拉电阻,这是触发PD充电的核心条件;数据部分通过短接正反插引脚实现盲插功能。文档还提供了完整的引脚对照表,并强调PCB布局需注意ESD防护、差分走线阻抗控制等要点,为Type-C接口设计提供了实用指导。

在读研究生,FPGA电路设计与功能开发。 583

二十三种设计模式及其python实现

本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python 参考文献: 《大话设计模式》——吴强 《Python设计模式》——pythontip.com 《23种设计模式》——http://www.cnblogs.com/beijiguangyong/ 设计模式是什么? 设计模式是经过总结、优化的,对我们经常

zheng_lan_fang的博客 6621

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

python程序代码解析,如何解析Python中的C ++源代码?

We want to parse our huge C++ source tree to gain enough info to feed to another tool to make diagrams of class and object relations, discern the overall organization of things etc.My best try so far...

weixin_27945229的博客 325

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

用Python实现简单的边缘计算框架

该代码能实现简单的边缘计算,并且输出任务的执行时刻和截止时刻。

DanielWu2020的博客 2190

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

python26种基本设计_二十三种设计模式及其python实现

转自:https://www.cnblogs.com/Liqiongyu/p/5916710.html本文源码寄方于github:https://github.com/w392807287/Design_pattern_of_python参考文献:《大话设计模式》——吴强《Python设计模式》——pythontip.com《23种设计模式》——http://www.cnblogs.com/bei...

weixin_39662578的博客 231

python编译字节码,为什么python在解释之前将源码编译为字节码?

Why python compile the source to bytecode before interpreting?Why not interpret from the source directly?解决方案Nearly no interpreter really interprets code directly, line by line – it's simply too ineff...

weixin_36329071的博客 139

Python 高手编程系列二百七十六:测试覆盖率

py.test 中的典型解决方案要容易得多。在我们的例子中,我们使用了 py.test 框架中的 monkey-patching 实用程序,但。在上面的代码中,我们使用了一个新的 pytest.yield_fixture()装饰器。Python 中有很多模拟库,但最常见的是 unittest.mock,标准库中也提供了该库。例中,我们手动执行了一切,并提供了一个自定义的 patch_smtplib()固件函数,具有。创建之初,它是一个第三方包,并不是 Python 分发版的一部分,但很快就作为临时包加入。

2401_86113894的博客 948

3-折腾python:1+1=3

修改python内部,让1+1变成3! 在此过程中探索python虚拟机内部的表层原理和调用约定,对python有更加深刻的认知,看见它不一样的一面!

DogMonkeys的博客 2510

python编译字节码_为什么python在解释之前将源码编译为字节码?

Why python compile the source to bytecode before interpreting?Why not interpret from the source directly?解决方案Nearly no interpreter really interprets code directly, line by line – it's simply too ineff...

weixin_39612220的博客 155
上一篇: MacBook Pro 2014 Mid 无法升级 macOS 12?微信、Trae、OpenClaw 无法安装的终极解决方案(OpenCore 教程)
下一篇: Python仿真神器SimPy:麻雀虽小,五脏俱全
Hi David
博客等级 码龄17年 5195粉丝 84原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Hi David

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

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

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

打赏作者

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

抵扣说明:

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

余额充值