gdb/pyseidon

GitHub: gdb/pyseidon

Pyseidon 通过 fork 机制实现 Python 工作负载的「一次加载、多次运行」,让需要频繁启动的 Python 脚本跳过重复的初始化阶段。

Stars: 39 | Forks: 1

# Pyseidon:基于 fork 的“一次加载,多次运行” Python server ![Pyseidon:基于 fork 的“一次加载,多次运行” Python server](https://i.imgur.com/DwC22BK.png) Pyseidon 为任何 Python 工作负载实现了一种“一次加载,多次运行”的范式。当你每次启动进程时都需要进行缓慢的固定设置,随后再执行一些动态变化的工作负载,使用它来加快加载时间会非常有用。 一个常见的用例是预加载一些加载缓慢且很少变动的依赖项;此外,你也可以用它来一次性预加载一个大型数据集。 Pyseidon 的工作原理是启动一个执行一次性设置的 server 进程;随后你可以动态地将 client 连接到该 server,这会促使 server 进行 fork 并在生成的 subprocess 中运行你的工作负载。 作为用户,这感觉就像是在运行一个 Python 脚本,但一次性设置只会发生一次。 [Poseidon](https://github.com/stripe-ctf/poseidon) 是同一概念的 Ruby 实现。 # 安装 你可以通过 `pip` 安装: ``` pip install pyseidon ``` 或者你可以从源码安装: ``` git clone https://github.com/gdb/pyseidon pip install -e pyseidon cd pyseidon/client && make ``` # 如何使用 - 创建并运行一个 Pyseidon server 进程: ``` $ cat < server.py import pyseidon import sys def handler(): print(f'Hi from worker. Your client ran with args: {sys.argv}') pyseidon = pyseidon.Pyseidon() pyseidon.run(handler) EOF $ python server.py ``` - 通过提供的 client 连接到该 server 进程: ``` $ pyseidon a b c Hi from worker. Your client ran with args: ['a', 'b', 'c'] ``` # 运行机制 Pyseidon 的工作原理是让 client 将其 stdin、stdout 和 stderr file descriptors 发送给由 server 生成的 worker 进程。其工作流程如下: - Pyseidon server 接受来自 client 的连接,并 fork 出一个 worker。 - client 将其 argv、当前工作目录以及它的 stdin、stdout、stderr file descriptors 发送过去。 - worker 安装这些 file descriptors,cd 到该工作目录,然后执行 server 提供的 handler。 由于 worker 是从 server fork 出来的,它对 server 地址空间中的所有变量和代码拥有完全的 copy-on-write 访问权限。这意味着它可以访问已由 server 加载的任何数据集(并且可以随意篡改该数据或加载新代码,而无需担心)。 # 待办事项 - 从 client 转发信号 - 用 Rust 重写 client - 寻找一种更不那么 hacky 的方式来编译 client
标签:Python, SOC Prime, 可视化界面, 开发工具, 性能优化, 无后门, 服务端, 检测绕过, 逆向工具, 预热加载