使用rust开发的高性能python压测工具
Project description
atomic-bomb-engine-py
atomic-bomb-engine的python包装实现
前端仓库
atomic-bomb-engine-front
使用条件:
- python版本 >= 3.8
- windows(x86), linux(x86), mac
使用方法:
-
准备开始
通过pip安装 (0.5.0版本之前)
pip install atomic-bomb-engine-py
在python中引用时注意,需要引用atomic_bomb_engine, 而不是atomic_bomb_engine_py
为了避免混淆,0.5.0版本之后,pip更换了包名,更改为atomic-bomb-engine,
pip install atomic-bomb-engine
在python中导入
import atomic_bomb_engine
异步使用的时候,还需要引用asyncio
import asyncio
-
开始压测
-
单接口压测(功能与多接口压测重叠,已废除) -
多接口压测
-
多接口压测可以先使用
runner = atomic_bomb_engine.BatchRunner()
实例化一个runner类 通过runner类中的run方法开启压测 run方法函数签名如下
def run(
self,
test_duration_secs: int,
concurrent_requests: int,
api_endpoints:List[Dict],
step_option:Dict[str, int]|None=None,
setup_options:List[Dict[str, Any]]|None=None,
verbose:bool=False,
should_prevent:bool=False,
assert_channel_buffer_size:int=1024,
timeout_secs=0,
cookie_store_enable=True
) -> None:
"""
批量压测
:param test_duration_secs: 测试持续时间
:param concurrent_requests: 并发数
:param api_endpoints: 接口信息
:param step_option: 阶梯加压选项
:param setup_options: 初始化选项
:param verbose: 打印详细信息
:param should_prevent: 是否禁用睡眠
:param assert_channel_buffer_size: 断言队列buffer大小
:param timeout_secs: http超时时间
:param cookie_store_enable: 是否为客户端启用持久性cookie存储。
"""
使用assert_option方法可以返回断言选项字典
assert_options=[
atomic_bomb_engine.assert_option("$.code", 429),
atomic_bomb_engine.assert_option("$.code", 200)
])
jsonpath如果不会用的话,建议去jsonpath学习
使用step_option方法可以返回阶梯加压选项字典
def step_option(increase_step: int, increase_interval: int) -> Dict[str, int]:
"""
生成step option
:param increase_step: 阶梯步长
:param increase_interval: 阶梯间隔
"""
同样的本包中也包含了一个对api_endpoint的包装:endpoint方法,方便调用,endpoint中的assert_options中也可以套用assert_option方法
async def run_batch():
result = await atomic_bomb_engine.batch_async(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
print(result)
return result
监听时可以在使用完run方法后,继续迭代runner即可
压测+同时监听
import asyncio
async def batch_async():
runner = atomic_bomb_engine.BatchRunner()
runner.run(
test_duration_secs=30,
concurrent_requests=30,
step_option=atomic_bomb_engine.step_option(increase_step=3, increase_interval=3),
timeout_secs=15,
cookie_store_enable=True,
verbose=False,
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-1",
url="http://127.0.0.1:8080/direct",
method="POST",
json={"name": "test-1", "number": 1},
weight=100,
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.msg", reference_object="操作成功"),
],
),
])
return runner
async def main():
results = await batch_async()
for res in results:
if res.get("should_wait"):
await asyncio.sleep(0.1)
print(res)
if __name__ == '__main__':
asyncio.run(main())
压测时使用ui界面监控
0.5.0版本后,添加了ui页面,支持批量压测方法
导入
from atomic_bomb_engine import server
使用
import asyncio
import atomic_bomb_engine
from atomic_bomb_engine import server
@server.ui(port=8000)
async def batch_async():
runner = atomic_bomb_engine.BatchRunner()
runner.run(
# 测试持续时间
test_duration_secs=60,
# 并发量
concurrent_requests=200,
# 阶梯设置(每5秒增加30个并发)
step_option=atomic_bomb_engine.step_option(increase_step=30, increase_interval=5),
# 接口超时时间
timeout_secs=10,
# 是否开启客户端启用持久性cookie存储
cookie_store_enable=True,
# 全局初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)],
# 是否开启详细日志
verbose=False,
# 被压接口设置
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
])
return runner
if __name__ == '__main__':
asyncio.run(batch_async())
使用server.ui装饰器,可以给批量压测方法启动一个简单的web服务器,不需要再手动监听BatchListenIter生成器
内部架构图
[0.19.0] - 2024-04-16
Added
- 增加了初始化和参数模版功能
setup_options=[
atomic_bomb_engine.setup_option(
name="初始化-1",
url="http://localhost:8080/setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="test-msg", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="test-code", jsonpath="$.code"),
]
)]
上述实例展示了如何在初始化的时候调用某个接口,并且通过jsonpath将数据提取出来,保存在全局变量test-msg和test-code中 提取完全局变量后,就可以在后续的api_endpoints中使用
api_endpoints=[
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),
]
上述实例展示了如何在请求中使用全局变量,使用双大括号即可使用
Fixed
- 修复了如果http状态码错误时,不会记录
- 修复了json反序列化的问题
[0.20.0] - 2024-04-17
Added
断言更改为异步生产消费,提升性能
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
[0.22.0] - 2024-04-18
Added
前端进行了性能优化
[0.24.0] - 2024-04-22
Added
异步断言使用了补偿消息,保证消息的一致性
[0.25.0] - 2024-04-23
Added
在endpoints中增加思考时间,模拟用户行为
think_time_option(min_millis=200, max_millis=300)
- min_millis:最小思考时间(毫秒)
- max_millis:最大思考时间(毫秒)
使用时在endpoint中增加think_time_option参数
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-1",
url="http://localhost:8080/a",
method="POST",
weight=1,
timeout_secs=10,
json={"name": "{{test-msg}}", "number": "{{test-code}}"},
think_time_option=atomic_bomb_engine.think_time_option(min_millis=200, max_millis=300),
),
]
[0.26.0] - 2024-04-24
Added
- 增加endpoint中的setup,在并发中可以做接口断言
- 增加有关联条件下的cookie自动管理功能
atomic_bomb_engine.endpoint(
# 接口任务命名
name="test-1",
# 针对每个接口初始化
setup_options=[
atomic_bomb_engine.setup_option(
name="api-初始化-1",
url="http://localhost:8080/api_setup",
method="get",
jsonpath_extract=[
atomic_bomb_engine.jsonpath_extract_option(key="api-test-msg-1", jsonpath="$.msg"),
atomic_bomb_engine.jsonpath_extract_option(key="api-test-code-1", jsonpath="$.code"),
]
)
],
# 被压接口url
url="http://localhost:8080/direct",
# 请求方式
method="POST",
# 权重
weight=1,
# 发送json请求
json={"name": "{{api-test-msg-1}}", "number": 1},
# 断言选项
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.number", reference_object=1),
],
# 思考时间选项(在最大和最小之间随机,单位毫秒)
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
)
- 参数cookie_store_enable控制是否自动管理cookie,前置条件的cookie会带入到最终的压测接口中
- 在endpoint中使用setup_options可以传入多个接口,并且提取参数
- 提取到的参数如果和全局的setup的key冲突,会覆盖全局提取到的参数
- 接口中提取的参数只能在本线程(v-user)中使用
- ⚠️ 使用时注意:setup_options是顺序执行的,没有并发,但是相当于添加了think time
[0.28.0] - 2024-04-25
Added
- 将持久化cookie添加到全局选项中
- 复用http client
- 选择性开启断言任务
- 接口初始化时出现错误等待后重试##
[0.29.0] - 2024-04-25
Added
- 优化并发逻辑
- 前端更改为web worker发送心跳
[0.38.0] - 2024-05-7
Added
- 增加附件上传功能
- 在初始化和每个接口中增加了multipart_options参数用于附件上传
- 增加multipart_option方法封装附件参数
- form_key: form表单的key
- path: 附件路径
- file_name: 附件名
- mime: 附件类型 (类型可以参考这里)
api_endpoints=[
atomic_bomb_engine.endpoint(
name="test-file",
url="http://127.0.0.1:8888/upload",
method="post",
weight=100,
multipart_options=[atomic_bomb_engine.multipart_option(form_key="file", path="./ui.py", file_name="ui.py", mime="text/plain")],
assert_options=[
atomic_bomb_engine.assert_option(jsonpath="$.message", reference_object="File uploaded successfully!"),
],
think_time_option=atomic_bomb_engine.think_time_option(min_millis=500, max_millis=1200),
),]
[0.39.0] - 2024-05-15
Added
- 启用BatchRunner类,每次执行可以返回一个迭代器
- 废除run_batch方法
- 废除ResultsIter迭代器
bug和需求
- 如果发现了bug,把复现步骤一起写到Issus中哈
- 如果有需求也可以在Issues中讨论
- 本程序是本人业余时间开发,不太准备保证时效性,但是如果有时间,一定第一时间回复和修改bug
TODO
- 前端展示页面 ✅
- 接口关联 ✅
- 每个接口可以配置思考时间 ✅
- 增加form支持 ✅
- 增加代理支持
- 增加附件支持 ✅
- 断言支持不等于等更多表达方式
联系方式
- 邮箱:qyzhg@qyzhg.com
- 微信:qy-zhg
👏🏻👏🏻👏🏻欢迎加群交流
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Hashes for atomic_bomb_engine-0.39.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b0251ca41961b5fa649a48b6ad4da37279d4342c8345672ab4fcb50779aaf0c8 |
|
MD5 | 6ec71314417a07a144aef926fd12ac3f |
|
BLAKE2b-256 | e65963e32473e45f001359cefb325a523d18e42c159a753f6d77fbb8eb08f105 |
Hashes for atomic_bomb_engine-0.39.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 305be8f7108d3781d518eb29a4737dcea89bcd151dbbf49e4f0149f9c8057cb8 |
|
MD5 | c0a0e565c852430f1dca053c258d582b |
|
BLAKE2b-256 | 3837f10c333472640756bccde1e2aa890cbc8f2527ad3fbfd5656b729fe9dfdc |
Hashes for atomic_bomb_engine-0.39.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0be77503670187b3bbab92f3044b11ec79e8444adcdfdca4a435b773a1250f8f |
|
MD5 | 53e033ccea809e20b417e120ea31ada6 |
|
BLAKE2b-256 | 9dcce91b5c2de34d8a7b0066aedd87ec92ffc0a7ec66f3922427ecde41583ea8 |
Hashes for atomic_bomb_engine-0.39.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 762880a11b70fe896b2d9fa38ea4e42ae8e09f2e8c952487c2353e2b6e1a164e |
|
MD5 | 262cf4ed12a097ff75b4ed805d1db5d6 |
|
BLAKE2b-256 | 8cbe80e60813e89534ca47ba545981b4c1aa3ee00d124bd23e96074a1866c53a |
Hashes for atomic_bomb_engine-0.39.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 85d4bfa500baebe1a8ca4c18dff1e5b8127ccc5b81bbf9f1c233bdb0ef72ec8b |
|
MD5 | 3661af24d4246c1005ea8f494c3f779e |
|
BLAKE2b-256 | 99a80af846b3e57467210dd7e0b9fab1b772dc3ba8dedc5eb5d11ba232e65531 |
Hashes for atomic_bomb_engine-0.39.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | bcf57b629cba41d807befc54b1072790b16cdecbff595e6f91bcc95f0fe6c2c3 |
|
MD5 | 2d0f2aa4bf5df94eb7483114e59cc3c0 |
|
BLAKE2b-256 | 96308e534675b86685566295aae7d774765c3a2543bcc8cd81212b51a79741b0 |
Hashes for atomic_bomb_engine-0.39.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 23903f53f18114fad2c1e2bd883039140b3f6ce6b818d985850f73b866c8c1e9 |
|
MD5 | bc755d925cd693c82bd181205e59356d |
|
BLAKE2b-256 | 26bcfbc1f0058554cbba8320f1cf81555300cf4faae4423452c3278e394faeba |
Hashes for atomic_bomb_engine-0.39.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e976259a3f250cf0094b83fcfdafcfa39bf5850bc153a8ad6511f6c80a777a47 |
|
MD5 | 9aa795ea810fbfce6bd4e64bf6b381f5 |
|
BLAKE2b-256 | 0a4eb59168de89714ae05a2efbc09884a40ce44ec3957944dcb12177ca61b214 |
Hashes for atomic_bomb_engine-0.39.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b140a53d8a37f248d970755fc32eb7b8e7e8f59220a87e2ad7b1f5012c05f280 |
|
MD5 | 231a07ff30d7616451257ba7967a190e |
|
BLAKE2b-256 | 240b9745a4906d9638bc5f599368a2008d502b17d18042fc034a6ebb360e2e41 |
Hashes for atomic_bomb_engine-0.39.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | b932a45821281b828ce1eb5195e7ff05ef013e8f9bba406441b26355a4c15848 |
|
MD5 | e1336117ba12ace2fc424b01555ce557 |
|
BLAKE2b-256 | b6e43f9c819a0b5e58c19f68654d5f6ace45046e28eb3e3df49809ed7cbe25d3 |
Hashes for atomic_bomb_engine-0.39.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 47cf958f4efba5c7f8d395d47a1c4d34f3b1045c19c66db0a09b1b734c902c3f |
|
MD5 | f54f7d69fb96d31fc8b90f751584b628 |
|
BLAKE2b-256 | d8a2b656e5ed0c3a1a64f1afa968ba5f615507462abb13ae24d5b3aab23c7045 |
Hashes for atomic_bomb_engine-0.39.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e03b9bdfdd180692e0be6dd1db25587307953bb880201036ea23a461075ba04e |
|
MD5 | 29aab98a52a0f476f041f4847d138595 |
|
BLAKE2b-256 | 889792fbd059690e2cc47ae1c61d5384d2f23996e1b3bbf175b6cebf7dfb0dcb |
Hashes for atomic_bomb_engine-0.39.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4fb12d29b6b9ee4e5042f7b9532d117baf8d044c7354e40aebbbf991c19a3249 |
|
MD5 | 2523837aea1cb680ad5b26d987a4e0b4 |
|
BLAKE2b-256 | f90d04a82427a0df97cd5a9324046149f02bf6a9920e9fdb4b2edc193bf2a2c9 |
Hashes for atomic_bomb_engine-0.39.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 97aa509d8a6693a26bfceb694a35e547cef59f57e10107c34388befdb4b6a732 |
|
MD5 | 368d74bc18a24e5c136ac146a30a8269 |
|
BLAKE2b-256 | 9f375cf3c0207744170bf2af67f0ff36c240c796849b02e4f73a86b8fa34c392 |
Hashes for atomic_bomb_engine-0.39.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6e1ee6a0800e789b049b519bc6351e152ad49748621fac96aff91b81a97cb56e |
|
MD5 | 4551caa8295e2c68d2756d2a192d793d |
|
BLAKE2b-256 | 6f85c905e93a0af37b494aa8c1c8bad76b70f40ff10ef24e67cc6a0cb4b5a861 |
Hashes for atomic_bomb_engine-0.39.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 96dd841483eaff2fd76ddc1f54bf9f1dad26d23c4c821a9b4d71f4f687842131 |
|
MD5 | f07d63b21352cf4c7868c8b8286ca147 |
|
BLAKE2b-256 | 1f3066d4f5307f4a1a696e53303c5a127d60a000549ffc35c4dbe8e614f9447a |
Hashes for atomic_bomb_engine-0.39.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fc076bffd0493ca357534dc9ec6a562d508b1f7b64ede03e146fae6224c74eeb |
|
MD5 | 939eb164c01dc0d0fa174b11600252e4 |
|
BLAKE2b-256 | 67da119477304fda4b5490b1ce259376f872b251d5e01d600b487276063bfb50 |
Hashes for atomic_bomb_engine-0.39.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 37696d09ef71d6060dbbdab5edd0ce160b66ef4aa2c8175b3c73f34bd099d518 |
|
MD5 | e8a175ed6044c4d7df96447679d7b6ce |
|
BLAKE2b-256 | b7b6b46d3a25b0b871ac18d8cca7479f7f51325e1f6d46d254f6c5a3e5ac5f4d |
Hashes for atomic_bomb_engine-0.39.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 4179dd51adea519c84597913f62d3afe0e1c7142f6b571b232b8ac6a0da8116f |
|
MD5 | de6c26e68d65e405c7704d5f9bd39dc8 |
|
BLAKE2b-256 | 5ff0e197c6bfb0282ca48456ff30d64e459703a29a2e2117b845090fa15e4c65 |
Hashes for atomic_bomb_engine-0.39.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 42a66e4bceeaaaef71cfffbd3a5b3512a34587799d5410d8287a27a3f202c214 |
|
MD5 | 1e608d3025e896a0bce02ef8dbbdca26 |
|
BLAKE2b-256 | 98b50482d82ef7897fe209d55060ab8428ddcb81823cb36634da3f8b10d56fda |
Hashes for atomic_bomb_engine-0.39.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 065dff4b71140f0a3afc88d22374649def0948c2ac5ac72f5a13b9bebfaff121 |
|
MD5 | ce4171d0e67bedd80918afa6017936d3 |
|
BLAKE2b-256 | e8e746c3da886227063eff9565e5c0bbfc2573a99ec48e074f24485ee2a40ba7 |
Hashes for atomic_bomb_engine-0.39.0-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 28696f128affc372cf1c2ed36f56ef0730a5c0207ac531ec6ecc5a94cc93aae1 |
|
MD5 | 10519068e7f66b7e8fb6b182798094bb |
|
BLAKE2b-256 | f5afa9e26ceb4099a6dad005df909b0de64921618e1a878b3c816a94cb3c3138 |
Hashes for atomic_bomb_engine-0.39.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 936e11fd7f51cdafb0176167dadefee80b3d722cfdc4ed96fb8429329895e032 |
|
MD5 | 1a6b3b4640a969825c4a4080f60a9760 |
|
BLAKE2b-256 | b05df67646c8250fa35ba797edd975ae5a2a854c301f9e289194426ef35660bc |
Hashes for atomic_bomb_engine-0.39.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 25b8bc9b23591035eaf3bafdf0f281673d5dce0b8beb824fe1f9e0627ed2c7be |
|
MD5 | aa0e3dfdaaf983a70c70ddf5fe492f89 |
|
BLAKE2b-256 | 5c619853a143396e73b2a4c033c9d5f29ecf9d5d53ee12fb319252dd6873418a |
Hashes for atomic_bomb_engine-0.39.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | e6c5712b88f859b40fca8bfb5bb26d64a8f130ac87d60e36193b7e020a00278a |
|
MD5 | df5cbc8e6c2251347ea31644c8f5d837 |
|
BLAKE2b-256 | a999c33d0bcb364ac9ac17856bbc288b8ecb97ba79d59f627d877a96cda7787b |