Python 类变量修改的压力测试:高并发场景

你想在 Python 中测试高并发场景下类变量的修改压力,核心是验证多线程 / 多进程并发修改类变量时的安全性、性能表现,以及可能出现的线程安全问题。

一、测试方案设计思路

  1. 核心目标 :模拟高并发下多个执行单元(线程 / 进程)同时读写类变量,观察:
    • 是否出现数据不一致(线程安全问题)
    • 并发量与执行效率的关系
    • 不同同步机制(锁)对性能的影响
  2. 测试场景
    • 无锁场景:验证并发修改的安全性问题
    • 有锁场景(线程锁 / 进程锁):验证同步机制的有效性
    • 不同并发量(10/100/1000 个执行单元)对比
  3. 测试对象
    • 类变量(属于类本身,所有实例共享)
    • 测试操作:对类变量执行「自增」(读 - 改 - 写原子操作)

二、完整测试代码(线程 + 进程场景)

需要先安装依赖(如需进程间通信):

bash

运行

复制代码
pip install multiprocessing  # Python 标准库,通常默认已安装

python

运行

复制代码
import threading
import multiprocessing
import time
import sys

# 定义测试类(包含共享类变量)
class Counter:
    # 类变量:所有实例/线程/进程共享
    count = 0
    # 线程锁(用于线程安全场景)
    thread_lock = threading.Lock()
    # 进程锁(用于进程安全场景,multiprocessing 跨进程共享需特殊处理)
    process_lock = multiprocessing.Lock()

# ------------------------------
# 1. 线程并发测试(同一进程内共享类变量)
# ------------------------------
def thread_worker(lock_enabled=True, iterations=1000):
    """线程工作函数:修改类变量"""
    for _ in range(iterations):
        if lock_enabled:
            # 加锁保证原子操作
            with Counter.thread_lock:
                Counter.count += 1
        else:
            # 无锁:直接修改(存在线程安全问题)
            Counter.count += 1

def test_thread_concurrency(thread_num=10, iterations=1000, lock_enabled=True):
    """测试线程并发修改类变量"""
    # 重置类变量
    Counter.count = 0
    start_time = time.time()
    
    # 创建线程池
    threads = []
    for _ in range(thread_num):
        t = threading.Thread(target=thread_worker, args=(lock_enabled, iterations))
        threads.append(t)
        t.start()
    
    # 等待所有线程完成
    for t in threads:
        t.join()
    
    end_time = time.time()
    elapsed = end_time - start_time
    expected = thread_num * iterations  # 理论预期值
    actual = Counter.count  # 实际结果
    consistent = (actual == expected)  # 是否数据一致
    
    return {
        "场景": f"线程并发({thread_num}线程,{iterations}次/线程)",
        "是否加锁": lock_enabled,
        "预期结果": expected,
        "实际结果": actual,
        "数据一致": consistent,
        "耗时(秒)": round(elapsed, 4)
    }

# ------------------------------
# 2. 进程并发测试(跨进程共享类变量需特殊处理)
# ------------------------------
# 注意:多进程中,类变量默认是每个进程的副本,需用 Manager 共享
def init_process(shared_counter, lock):
    """进程初始化:传递共享计数器和锁(跨进程共享)"""
    global counter, process_lock
    counter = shared_counter
    process_lock = lock

def process_worker(iterations=1000, lock_enabled=True):
    """进程工作函数:修改共享计数器(模拟类变量)"""
    for _ in range(iterations):
        if lock_enabled:
            with process_lock:
                counter.value += 1
        else:
            counter.value += 1

def test_process_concurrency(process_num=10, iterations=1000, lock_enabled=True):
    """测试进程并发修改共享变量(模拟类变量跨进程共享)"""
    # 多进程共享变量:用 Manager.Value 创建可跨进程修改的整数
    manager = multiprocessing.Manager()
    shared_counter = manager.Value('i', 0)  # 'i' 表示整数类型
    process_lock = multiprocessing.Lock()
    
    start_time = time.time()
    
    # 创建进程池(传递共享变量和锁)
    processes = []
    for _ in range(process_num):
        p = multiprocessing.Process(
            target=process_worker,
            args=(iterations, lock_enabled),
            initargs=(shared_counter, process_lock)  # 进程初始化参数
        )
        processes.append(p)
        p.start()
    
    # 等待所有进程完成
    for p in processes:
        p.join()
    
    end_time = time.time()
    elapsed = end_time - start_time
    expected = process_num * iterations
    actual = shared_counter.value
    consistent = (actual == expected)
    
    # 关闭 Manager
    manager.shutdown()
    
    return {
        "场景": f"进程并发({process_num}进程,{iterations}次/进程)",
        "是否加锁": lock_enabled,
        "预期结果": expected,
        "实际结果": actual,
        "数据一致": consistent,
        "耗时(秒)": round(elapsed, 4)
    }

# ------------------------------
# 3. 执行压力测试并输出结果
# ------------------------------
def run_stress_test():
    """执行完整压力测试:不同并发量+有无锁对比"""
    # 测试配置:并发量(线程/进程数)和每个执行单元的迭代次数
    test_cases = [
        # 线程测试用例
        ("thread", 10, 10000),   # 10线程,每线程1万次
        ("thread", 100, 10000),  # 100线程,每线程1万次
        ("thread", 1000, 1000),  # 1000线程,每线程1千次
        # 进程测试用例(进程数不宜过多,避免系统资源耗尽)
        ("process", 10, 10000),  # 10进程,每进程1万次
        ("process", 20, 10000),  # 20进程,每进程1万次
    ]
    
    print("=" * 80)
    print("Python 类变量高并发修改压力测试结果")
    print("=" * 80)
    
    for case_type, concurrency, iterations in test_cases:
        # 分别测试「无锁」和「有锁」场景
        for lock_enabled in [False, True]:
            if case_type == "thread":
                result = test_thread_concurrency(concurrency, iterations, lock_enabled)
            else:
                result = test_process_concurrency(concurrency, iterations, lock_enabled)
            
            # 格式化输出
            print(f"\n【{result['场景']}】")
            print(f"  加锁状态: {'是' if result['是否加锁'] else '否'}")
            print(f"  预期结果: {result['预期结果']}")
            print(f"  实际结果: {result['实际结果']} ({'一致' if result['数据一致'] else '不一致'})")
            print(f"  耗时: {result['耗时(秒)']} 秒")
    
    print("\n" + "=" * 80)

if __name__ == "__main__":
    # 限制递归深度(避免高并发时出错)
    sys.setrecursionlimit(10000)
    run_stress_test()

三、代码关键说明

  1. 线程安全问题

    • 无锁场景下,Counter.count += 1 不是原子操作(实际是「读 - 改 - 写」三步),多线程并发时会出现数据覆盖,导致实际结果小于预期。
    • 加锁后(threading.Lock),强制同一时间只有一个线程修改变量,保证数据一致性,但会引入锁开销。
  2. 进程并发特殊处理

    • Python 多进程中,每个进程有独立的内存空间,类变量默认不共享,需用 multiprocessing.Manager 创建跨进程共享变量。
    • 进程锁(multiprocessing.Lock)用于解决跨进程的并发安全问题。
  3. 压力测试维度

    • 并发量:从 10 到 1000 逐步提升,观察性能变化。
    • 迭代次数:每个执行单元的修改次数,控制总操作量。
    • 有无锁对比:验证同步机制的必要性和性能损耗。

四、典型测试结果分析(示例)

表格

场景 加锁 预期结果 实际结果 数据一致 耗时 (秒)
10 线程 + 1 万次 / 线程 100000 89235 0.12
10 线程 + 1 万次 / 线程 100000 100000 0.35
1000 线程 + 1 千次 / 线程 1000000 789542 1.05
1000 线程 + 1 千次 / 线程 1000000 1000000 3.28
10 进程 + 1 万次 / 进程 100000 91234 0.87
10 进程 + 1 万次 / 进程 100000 100000 2.15

关键结论:

  • 无锁并发必然导致数据不一致,高并发下更严重。
  • 加锁能保证数据安全,但会增加耗时(锁竞争 overhead)。
  • 进程并发的开销远大于线程(进程切换成本高),相同并发量下耗时更长。

总结

  1. 线程并发 :类变量默认共享,无锁修改存在线程安全问题,需用 threading.Lock 保护;高并发(如 1000 线程)下锁竞争会明显影响性能。
  2. 进程并发 :类变量不默认共享,需通过 multiprocessing.Manager 实现跨进程共享,配合 multiprocessing.Lock 保证安全,整体开销高于线程。
  3. 实践建议:高并发修改共享变量时,优先用线程 + 锁(轻量级);若需跨进程,考虑用进程池 + 共享内存,或改用消息队列(如 Redis)避免直接共享变量。
  4. ahwxkf.com
    www.ahwxkf.com
    a1b2.ahwxkf.com
    sky07.ahwxkf.com
    run89.ahwxkf.com
    link22.ahwxkf.com
    cool56.ahwxkf.com
    fast31.ahwxkf.com
    star44.ahwxkf.com
    Zone78.ahwxkf.com
    net19.ahwxkf.com
    top63.ahwxkf.com
    fire27.ahwxkf.com
    soft51.ahwxkf.com
    page35.ahwxkf.com
    live81.ahwxkf.com
    data04.ahwxkf.com
    tool66.ahwxkf.com
    hub29.ahwxkf.com
    wave53.ahwxkf.com
    peak12.ahwxkf.com
    smart77.ahwxkf.com
    meta33.ahwxkf.com
    flow48.ahwxkf.com
    core09.ahwxkf.com
    wave21.ahwxkf.com
    mint69.ahwxkf.com
    tech15.ahwxkf.com
    byte42.ahwxkf.com
    grid58.ahwxkf.com
    pool37.ahwxkf.com
    key84.ahwxkf.com
    raw06.ahwxkf.com
    clip61.ahwxkf.com
    nest24.ahwxkf.com
    pure55.ahwxkf.com
    rack17.ahwxkf.com
    dash72.ahwxkf.com
    fold39.ahwxkf.com
    mint46.ahwxkf.com
    iron02.ahwxkf.com
    vein64.ahwxkf.com
    glow26.ahwxkf.com
    path52.ahwxkf.com
    hive14.ahwxkf.com
    drift79.ahwxkf.com
    slot32.ahwxkf.com
    bulk49.ahwxkf.com
    bond08.ahwxkf.com
    gaZe67.ahwxkf.com
    rust23.ahwxkf.com
    veil57.ahwxkf.com
    book.ahwxkf.com/article/B2c3D4e5F6.html
    book.ahwxkf.com/article/C3d4E5f6G7.html
    book.ahwxkf.com/article/D4e5F6g7H8.html
    book.ahwxkf.com/article/E5f6G7h8I9.html
    book.ahwxkf.com/article/F6g7H8i9J0.html
    book.ahwxkf.com/article/G7h8I9j0K1.html
    book.ahwxkf.com/article/H8i9J0k1L2.html
    book.ahwxkf.com/article/I9j0K1l2M3.html
    book.ahwxkf.com/article/J0k1L2m3N4.html
    book.ahwxkf.com/article/K1l2M3n4O5.html
    book.ahwxkf.com/article/L2m3N4o5P6.html
    book.ahwxkf.com/article/M3n4O5p6Q7.html
    book.ahwxkf.com/article/N4o5P6q7R8.html
    book.ahwxkf.com/article/O5p6Q7r8S9.html
    book.ahwxkf.com/article/P6q7R8s9T0.html
    book.ahwxkf.com/blog/Q7r8S9t0U1.html
    book.ahwxkf.com/blog/R8s9T0u1V2.html
    book.ahwxkf.com/blog/S9t0U1v2W3.html
    book.ahwxkf.com/blog/T0u1V2w3X4.html
    book.ahwxkf.com/blog/U1v2W3x4Y5.html
    book.ahwxkf.com/blog/V2w3X4y5Z6.html
    book.ahwxkf.com/blog/W3x4Y5Z6A7.html
    book.ahwxkf.com/blog/X4y5Z6a7B8.html
    book.ahwxkf.com/blog/Y5Z6A7b8C9.html
    book.ahwxkf.com/blog/Z6a7B8c9D0.html
    book.ahwxkf.com/article/a7B8c9D0e1.html
    book.ahwxkf.com/article/b8C9d0E1f2.html
    book.ahwxkf.com/article/c9D0e1F2g3.html
    book.ahwxkf.com/article/d0E1f2G3h4.html
    book.ahwxkf.com/article/e1F2g3H4i5.html
    book.ahwxkf.com/article/f2G3h4I5j6.html
    book.ahwxkf.com/article/g3H4i5J6k7.html
    book.ahwxkf.com/article/h4I5j6K7l8.html
    book.ahwxkf.com/article/i5J6k7L8m9.html
    book.ahwxkf.com/article/j6K7l8M9n0.html
    book.ahwxkf.com/article/k7L8m9N0o1.html
    book.ahwxkf.com/article/l8M9n0O1p2.html
    book.ahwxkf.com/article/m9N0o1P2q3.html
    book.ahwxkf.com/article/n0O1p2Q3r4.html
    book.ahwxkf.com/article/o1P2q3R4s5.html
    book.ahwxkf.com/article/p2Q3r4S5t6.html
    book.ahwxkf.com/article/q3R4s5T6u7.html
    book.ahwxkf.com/article/r4S5t6U7v8.html
    book.ahwxkf.com/article/s5T6u7V8w9.html
    book.ahwxkf.com/article/t6U7v8W9x0.html
    book.ahwxkf.com/article/u7V8w9X0y1.html
    book.ahwxkf.com/article/v8W9x0Y1Z2.html
    book.ahwxkf.com/article/w9X0y1Z2a3.html
    book.ahwxkf.com/article/x0Y1Z2A3b4.html
    bbs.ahwxkf.com/article/A1b2C3d4E5.html
    bbs.ahwxkf.com/article/B2c3D4e5F6.html
    bbs.ahwxkf.com/article/C3d4E5f6G7.html
    bbs.ahwxkf.com/article/D4e5F6g7H8.html
    bbs.ahwxkf.com/article/E5f6G7h8I9.html
    bbs.ahwxkf.com/article/F6g7H8i9J0.html
    bbs.ahwxkf.com/article/G7h8I9j0K1.html
    bbs.ahwxkf.com/article/H8i9J0k1L2.html
    bbs.ahwxkf.com/article/I9j0K1l2M3.html
    bbs.ahwxkf.com/article/J0k1L2m3N4.html
    bbs.ahwxkf.com/article/K1l2M3n4O5.html
    bbs.ahwxkf.com/article/L2m3N4o5P6.html
    bbs.ahwxkf.com/article/M3n4O5p6Q7.html
    bbs.ahwxkf.com/article/N4o5P6q7R8.html
    bbs.ahwxkf.com/article/O5p6Q7r8S9.html
    bbs.ahwxkf.com/article/P6q7R8s9T0.html
    bbs.ahwxkf.com/blog/Q7r8S9t0U1.html
    bbs.ahwxkf.com/blog/R8s9T0u1V2.html
    bbs.ahwxkf.com/blog/S9t0U1v2W3.html
    bbs.ahwxkf.com/blog/T0u1V2w3X4.html
    bbs.ahwxkf.com/blog/U1v2W3x4Y5.html
    bbs.ahwxkf.com/blog/V2w3X4y5Z6.html
    bbs.ahwxkf.com/blog/W3x4Y5Z6A7.html
    bbs.ahwxkf.com/blog/X4y5Z6a7B8.html
    bbs.ahwxkf.com/blog/Y5Z6A7b8C9.html
    bbs.ahwxkf.com/blog/Z6a7B8c9D0.html
    bbs.ahwxkf.com/article/a7B8c9D0e1.html
    bbs.ahwxkf.com/article/b8C9d0E1f2.html
    bbs.ahwxkf.com/article/c9D0e1F2g3.html
    bbs.ahwxkf.com/article/d0E1f2G3h4.html
    bbs.ahwxkf.com/article/e1F2g3H4i5.html
    bbs.ahwxkf.com/article/f2G3h4I5j6.html
    bbs.ahwxkf.com/article/g3H4i5J6k7.html
    bbs.ahwxkf.com/article/h4I5j6K7l8.html
    bbs.ahwxkf.com/article/i5J6k7L8m9.html
    bbs.ahwxkf.com/article/j6K7l8M9n0.html
    bbs.ahwxkf.com/article/k7L8m9N0o1.html
    bbs.ahwxkf.com/article/l8M9n0O1p2.html
    bbs.ahwxkf.com/article/m9N0o1P2q3.html
    bbs.ahwxkf.com/article/n0O1p2Q3r4.html
    bbs.ahwxkf.com/article/o1P2q3R4s5.html
    bbs.ahwxkf.com/article/p2Q3r4S5t6.html
    bbs.ahwxkf.com/article/q3R4s5T6u7.html
    bbs.ahwxkf.com/article/r4S5t6U7v8.html
    bbs.ahwxkf.com/article/s5T6u7V8w9.html
    bbs.ahwxkf.com/article/t6U7v8W9x0.html
    bbs.ahwxkf.com/article/u7V8w9X0y1.html
    bbs.ahwxkf.com/article/v8W9x0Y1Z2.html
    bbs.ahwxkf.com/article/w9X0y1Z2a3.html
    bbs.ahwxkf.com/article/x0Y1Z2A3b4.html
    mp.ahwxkf.com/article/A2b5C7d1E9.html
    mp.ahwxkf.com/article/B3c6D8e2F0.html
    mp.ahwxkf.com/article/C4d7E9f3G1.html
    mp.ahwxkf.com/article/D5e8F0g4H2.html
    mp.ahwxkf.com/article/E6f9G1h5I3.html
    mp.ahwxkf.com/article/F7g0H2i6J4.html
    mp.ahwxkf.com/article/G8h1I3j7K5.html
    mp.ahwxkf.com/article/H9i2J4k8L6.html
    mp.ahwxkf.com/article/I0j3K5l9M7.html
    mp.ahwxkf.com/article/J1k4L6m0N8.html
    mp.ahwxkf.com/article/K2l5M7n1O9.html
    mp.ahwxkf.com/article/L3m6N8o2P0.html
    mp.ahwxkf.com/article/M4n7O9p3Q1.html
    mp.ahwxkf.com/article/N5o8P0q4R2.html
    mp.ahwxkf.com/article/O6p9Q1r5S3.html
    mp.ahwxkf.com/blog/P7q0R2s6T4.html
    mp.ahwxkf.com/blog/Q8r1S3t7U5.html
    mp.ahwxkf.com/blog/R9s2T4u8V6.html
    mp.ahwxkf.com/blog/S0t3U5v9W7.html
    mp.ahwxkf.com/blog/T1u4V6w0X8.html
    mp.ahwxkf.com/blog/U2v5W7x1Y9.html
    mp.ahwxkf.com/blog/V3w6X8y2Z0.html
    mp.ahwxkf.com/blog/W4x7Y9Z3A1.html
    mp.ahwxkf.com/blog/X5y8Z0a4B2.html
    mp.ahwxkf.com/blog/Y6Z9A1b5C3.html
    mp.ahwxkf.com/blog/Z7a0B2c6D4.html
    mp.ahwxkf.com/article/a8b1C3d7E5.html
    mp.ahwxkf.com/article/b9c2D4e8F6.html
    mp.ahwxkf.com/article/c0d3E5f9G7.html
    mp.ahwxkf.com/article/d1e4F6g0H8.html
    mp.ahwxkf.com/article/e2f5G7h1I9.html
    mp.ahwxkf.com/article/f3g6H8i2J0.html
    mp.ahwxkf.com/article/g4h7I9j3K1.html
    mp.ahwxkf.com/article/h5i8J0k4L2.html
    mp.ahwxkf.com/article/i6j9K1l5M3.html
    mp.ahwxkf.com/article/j7k0L2m6N4.html
    mp.ahwxkf.com/article/k8l1M3n7O5.html
    mp.ahwxkf.com/article/l9m2N4o8P6.html
    mp.ahwxkf.com/article/m0n3O5p9Q7.html
    mp.ahwxkf.com/article/n1o4P6q0R8.html
    mp.ahwxkf.com/article/o2p5Q7r1S9.html
    mp.ahwxkf.com/article/p3q6R8s2T0.html
    mp.ahwxkf.com/article/q4r7S9t3U1.html
    mp.ahwxkf.com/article/r5s8T0u4V2.html
    mp.ahwxkf.com/article/s6t9U1v5W3.html
    mp.ahwxkf.com/article/t7u0V2w6X4.html
    mp.ahwxkf.com/article/u8v1W3x7Y5.html
    mp.ahwxkf.com/article/v9w2X4y8Z6.html
    mp.ahwxkf.com/article/w0x3Y5Z9A7.html
    mp.ahwxkf.com/article/x1y4Z6a0B8.html
    m.ahwxkf.com/article/A3b6C8d2E0.html
    m.ahwxkf.com/article/B4c7D9e3F1.html
    m.ahwxkf.com/article/C5d8E0f4G2.html
    m.ahwxkf.com/article/D6e9F1g5H3.html
    m.ahwxkf.com/article/E7f0G2h6I4.html
    m.ahwxkf.com/article/F8g1H3i7J5.html
    m.ahwxkf.com/article/G9h2I4j8K6.html
    m.ahwxkf.com/article/H0i3J5k9L7.html
    m.ahwxkf.com/article/I1j4K6l0M8.html
    m.ahwxkf.com/article/J2k5L7m1N9.html
    m.ahwxkf.com/article/K3l6M8n2O0.html
    m.ahwxkf.com/article/L4m7N9o3P1.html
    m.ahwxkf.com/article/M5n8O0p4Q2.html
    m.ahwxkf.com/article/N6o9P1q5R3.html
    m.ahwxkf.com/article/O7p0Q2r6S4.html
    m.ahwxkf.com/blog/P8q1R3s7T5.html
    m.ahwxkf.com/blog/Q9r2S4t8U6.html
    m.ahwxkf.com/blog/R0s3T5u9V7.html
    m.ahwxkf.com/blog/S1t4U6v0W8.html
    m.ahwxkf.com/blog/T2u5V7w1X9.html
    m.ahwxkf.com/blog/U3v6W8x2Y0.html
    m.ahwxkf.com/blog/V4w7X9y3Z1.html
    m.ahwxkf.com/blog/W5x8Z0a4A2.html
    m.ahwxkf.com/blog/X6y9A1b5B3.html
    m.ahwxkf.com/blog/Y7Z0B2c6C4.html
    m.ahwxkf.com/blog/Z8a1C3d7D5.html
    m.ahwxkf.com/article/a9b2D4e8E6.html
    m.ahwxkf.com/article/b0c3E5f9F7.html
    m.ahwxkf.com/article/c1d4F6g0G8.html
    m.ahwxkf.com/article/d2e5G7h1H9.html
    m.ahwxkf.com/article/e3f6H8i2I0.html
    m.ahwxkf.com/article/f4g7I9j3J1.html
    m.ahwxkf.com/article/g5h8J0k4K2.html
    m.ahwxkf.com/article/h6i9K1l5L3.html
    m.ahwxkf.com/article/i7j0L2m6M4.html
    m.ahwxkf.com/article/j8k1M3n7N5.html
    m.ahwxkf.com/article/k9l2N4o8O6.html
    m.ahwxkf.com/article/l0m3O5p9P7.html
    m.ahwxkf.com/article/m1n4P6q0Q8.html
    m.ahwxkf.com/article/n2o5Q7r1R9.html
    m.ahwxkf.com/article/o3p6R8s2S0.html
    m.ahwxkf.com/article/p4q7S9t3T1.html
    m.ahwxkf.com/article/q5r8T0u4U2.html
    m.ahwxkf.com/article/r6s9U1v5V3.html
    m.ahwxkf.com/article/s7t0V2w6W4.html
    m.ahwxkf.com/article/t8u1W3x7X5.html
    m.ahwxkf.com/article/u9v2X4y8Y6.html
    m.ahwxkf.com/article/v0w3Y5Z9Z7.html
    m.ahwxkf.com/article/w1x4Z6a0A8.html
    m.ahwxkf.com/article/x2y5A7b1B9.html
相关推荐
hikktn1 小时前
Excel 日期格式统一治理:从“显示不全“到“自动兼容“的完整方案
windows·python·excel
天天进步20152 小时前
Tunnelto 源码解析 #13:自托管部署:Docker、环境变量、端口规划与单实例限制
开发语言
AI科技星2 小时前
第三卷:质数王朝志(全卷定稿)
c语言·开发语言·汇编·electron·概率论
财经资讯数据_灵砚智能2 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年6月11日
人工智能·python·ai·信息可视化·自然语言处理·ai编程·灵砚智能
CC数学建模2 小时前
2026年第十六届APMCM 亚太地区大学生数学建模竞赛(中文赛项)赛题C题:创业社区规划与资源配置优化问题完整思路、代码、模型、文章,全网首发高质量分享!
python·算法·数学建模
kyle~2 小时前
DDS分布式实时系统---自省机制
开发语言·分布式·机器人·c#·接口·ros2
yujunl2 小时前
Integrated Security=True(Windows 集成身份验证)
开发语言
2601_956139422 小时前
性价比高的VI设计质量
大数据·人工智能·python·物联网
右耳朵猫AI2 小时前
Python周刊2026W23 | Polars 1.41、PyPy v7.3.23、Python 3.15、httpx2、dj-lite-tenant
开发语言·python