使用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.40.0-cp312-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 081c4b2b73ea3727ae10e4aea0a41871aff0c4a16e94d3f535fe35792000b348 |
|
MD5 | 0c315c305270810e9e925b80ea06cc9e |
|
BLAKE2b-256 | 8bc3e9a3d919cf43a952c9fc807f2fd4bc5de01ea6ab15b6cdeedd92f6ea70d8 |
Hashes for atomic_bomb_engine-0.40.0-cp312-cp312-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f261b0adfed5b78dbb7478cc933feb45f795085baa1fa1b1193e09501742be58 |
|
MD5 | e078f7fc98dcfc300261b8a10cd0f5cb |
|
BLAKE2b-256 | d3ae66e4058e50e73885306a81f87f3ce1d91c855d5d38c70907ae538cf51e00 |
Hashes for atomic_bomb_engine-0.40.0-cp312-cp312-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0d7c6254fa0ef9ddd6485107e02a620d7d57f905c284dd196559066650ef0d91 |
|
MD5 | fe33f722b99a0b87edbfd66029fef33e |
|
BLAKE2b-256 | bad2074a92f5c141cd09013cdee2b3a81d367b0e019b0fb8bb1ff0c0ad7da2a8 |
Hashes for atomic_bomb_engine-0.40.0-cp312-cp312-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 124fef57ffd39824a260a1a5d62335e05c8fc1e78473f7b44a7102750bea798a |
|
MD5 | c81708ef401899b3ee3f3b86d84a83c5 |
|
BLAKE2b-256 | 06c7f15a4ed00665a726a78a00955651f32f3df0f085282b10b9654e389d4319 |
Hashes for atomic_bomb_engine-0.40.0-cp312-cp312-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 984a5be3b579758fa5bbd53e75bae8e710cfbf2feafc80b1b052add2436c983a |
|
MD5 | b9e1e7c4a04af77e830b8a670374a06d |
|
BLAKE2b-256 | eb076c24d4cf64232c2ebb4091e424993c3eb79663033f742b053db536adf4ba |
Hashes for atomic_bomb_engine-0.40.0-cp311-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 918f98909121736ea22bf02226e3f8e352626e9637f680123c634303ec855676 |
|
MD5 | 3c2d84662c3b676fa1fc76e135d09e30 |
|
BLAKE2b-256 | 979eeb9a9b1a2687d8d2914478af4b12b6516dbe385f66b4740f2a0d26ee915f |
Hashes for atomic_bomb_engine-0.40.0-cp311-cp311-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7f2f08ed2ccc046d1b469a5493c94c9cb539df0c6dc6e446dbcf22adc8d670d8 |
|
MD5 | 989baad14d8e14a23ff68718ff0521b6 |
|
BLAKE2b-256 | 15e2616eecf2973983bb4ac9d8e7a0d961750b419fecfc75bf76d5fcc41cc2ea |
Hashes for atomic_bomb_engine-0.40.0-cp311-cp311-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 7160240d7067efcc96875b7aecf204f8a774b683ba47ae2053d06149e7f70e35 |
|
MD5 | 0e90c0ce619aa6de63646dd86f772b1e |
|
BLAKE2b-256 | 7e9e848ac3d7614c17984f5c561811f39d0c1bf4553b3028b2d9fa027e98a8b1 |
Hashes for atomic_bomb_engine-0.40.0-cp311-cp311-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 95c17ec17ebe7a1b1bb5e31c4a093a9e9f54c9fad532ec77facef6c9f7797954 |
|
MD5 | ecb7c1e8077e2c419a8166e0a47d42fd |
|
BLAKE2b-256 | 2a83ea5ba117e83b6181dc5ceafca0f2452829cdf635257ec1e0a657e0e45517 |
Hashes for atomic_bomb_engine-0.40.0-cp311-cp311-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fa2ba48d1e3bdbae681eeffffccf363b5de68e05392937d3ada969af9d15170c |
|
MD5 | 184de2dbe07114a59ff1351df86082ca |
|
BLAKE2b-256 | 5ee25322acbfbc1ccd2f3692b1e88bf795884e5a2ce1fb3118db1f9b9752a8a6 |
Hashes for atomic_bomb_engine-0.40.0-cp310-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 56db7e80ccb660305a42d7591e0037142dc07000ff4169119756fc09a517ea22 |
|
MD5 | 2ea4364732a38f5027abcf32b3cbdb19 |
|
BLAKE2b-256 | bba2a01a4d429ccaf2d876be36c3d91946cc74c7860aecd06592b95e1aa4a329 |
Hashes for atomic_bomb_engine-0.40.0-cp310-cp310-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 54ad7a42516d0c64eb90f1e26a53f062bacbd485d607f788df562cda949b0bcb |
|
MD5 | 9ae3cd03c14cfeecdadffdad933eb7f1 |
|
BLAKE2b-256 | 3139fa4c9279031c876bc26d3de051ba3221dc7daaa1dd1b4c5313b7f51547ab |
Hashes for atomic_bomb_engine-0.40.0-cp310-cp310-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 5ef225945c0c638b0b7685ae4ec54c8f5e2138f5f58d9767a62fa81ce00f09b3 |
|
MD5 | 7ad9cfb7b10eed17a916d8f5fe96e416 |
|
BLAKE2b-256 | 9abd7ddda62ea971b9f50f61af98ae308442acc6d04bb9da9a90aa34c1933415 |
Hashes for atomic_bomb_engine-0.40.0-cp310-cp310-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | ecc9b03172edf9a7ac7523eaeec3867e7cbe843167005cd1302873159c9ee73a |
|
MD5 | c7c897c7fb517508b1af69aa3f515a81 |
|
BLAKE2b-256 | e57ee014f06565c05ea07f66a2a87c6c5e911471c05cfb296ef2254ba895d237 |
Hashes for atomic_bomb_engine-0.40.0-cp310-cp310-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 73f4658af5cb2e0a09daf24e9b0065ced818dacecc69e065b1b41c645d46f68d |
|
MD5 | 714d3fd02cb3dede730a8271796c7aaf |
|
BLAKE2b-256 | 45b5c563f7218b6a4b359d3f7f131caaee4b16a8e09c4a68cfe20517f6f0fe79 |
Hashes for atomic_bomb_engine-0.40.0-cp39-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c65637bc1851d3769b02bac048f7a3dc2d86138fe1bf1fe5d4c15dd102f7ddf4 |
|
MD5 | db556ee58b6862f2562f6df5c4196611 |
|
BLAKE2b-256 | 5c61eb53eff4a482ca6e3a8dd77d7ba28a5490168315f23c2215e81d6a6b17cc |
Hashes for atomic_bomb_engine-0.40.0-cp39-cp39-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 27c6fac4670720f3e121a1c54a0377c3fbf8e39ea95b806f7688403e0e9865e9 |
|
MD5 | 04bb41ad9419162e4e2d04211a8678de |
|
BLAKE2b-256 | 1d2c4f0bb5b61657b75c99fbfcde31a130f1e5135bb12fdf5cfd1ba5be6495e2 |
Hashes for atomic_bomb_engine-0.40.0-cp39-cp39-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9a3001b5da850534d108bc9e83e6089e3d3f68fbfc4795b44ff5a0ec299f0e27 |
|
MD5 | 085fc36d187079dba5d864073568d882 |
|
BLAKE2b-256 | 732afb43eae5badfd2be932aa3b21689982bd484c07a473e7e0361b109dc41db |
Hashes for atomic_bomb_engine-0.40.0-cp39-cp39-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | fa3ae96a293372b5189f2fd7028f002556b67baf6685a0e3f803e8efaf238db1 |
|
MD5 | acfac87aed9852b625a369a4f1976a9d |
|
BLAKE2b-256 | d3b66e31abb7aabbc290260e38ff721d97c2367fc90f5927a4bab9e579f4321c |
Hashes for atomic_bomb_engine-0.40.0-cp39-cp39-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 265c7d083410206aa9411c682bd6269d072c4691dcfae05688af5b037d247b2f |
|
MD5 | 12dc164c8643de0f423be4fffa3e7e3e |
|
BLAKE2b-256 | 2395e008740a909d9038c0af733340ac73307c88cfca8ae65a94260d472b1dbd |
Hashes for atomic_bomb_engine-0.40.0-cp38-none-win_amd64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | f880743acd75d2666171c0a107af60d40ebf17eea0d0f619f27944d6dd537d29 |
|
MD5 | 140d27eaa3b512f137d218890b8f4e3c |
|
BLAKE2b-256 | f1ecedb593bb07f0e33b0b7fa85a4356f84744f452dc0c1a987055a428a2acb3 |
Hashes for atomic_bomb_engine-0.40.0-cp38-cp38-musllinux_1_2_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | c7b21fe004a70c0b43b667f4953479c133652ba5fe0bd96a48b3154451081c15 |
|
MD5 | 8c2c5849cc3480141f7888046fa8d26e |
|
BLAKE2b-256 | 696baae734949ef0ec319907f968a745608c1cb7f9d8e5c0f5fc2c829e276ccd |
Hashes for atomic_bomb_engine-0.40.0-cp38-cp38-manylinux_2_34_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | dce36e79a901fe16b639af34366a707e49c3e194b5547c7dab02d0c2e49e156f |
|
MD5 | 182e8b1288782361a2384bbf11217003 |
|
BLAKE2b-256 | 6b900166deca4c2b1586b96e76b728c394443e7dadb6dd9728b50b60804fff5e |
Hashes for atomic_bomb_engine-0.40.0-cp38-cp38-macosx_11_0_arm64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0165c241bdef7d19e7c9386c29a07f7ecf60ccfcbba7bc0f973524b9d2e80306 |
|
MD5 | a47c3f103a74e316b3058e81c75b8e3c |
|
BLAKE2b-256 | a0c8e7e903a1ba908f1986b8fa9c805da19fcddcfe9756c55f8f4ee3e6308940 |
Hashes for atomic_bomb_engine-0.40.0-cp38-cp38-macosx_10_12_x86_64.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 0b9c4c8c59be688e1879c39db57626ec3b692dc5456dedd9dc52457c23330ee1 |
|
MD5 | f97efc381a3aaf01f57041b1af8d712d |
|
BLAKE2b-256 | 97da638aa98d6e555a8ef563667a348d5f81b5855be488a7b1013beee1efad7e |