V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
JL1990
V2EX  ›  问与答

求助 Python 多线程下的一个诡异问题,求解惑(20 行代码)

  •  
  •   JL1990 · 2020-02-25 16:36:26 +08:00 · 1184 次点击
    这是一个创建于 1734 天前的主题,其中的信息可能已经有所发展或是发生改变。
    from concurrent.futures import ThreadPoolExecutor
    
    insert_executor = ThreadPoolExecutor(max_workers=20)
    _TOTAL_TEST_DATA_NUMBERS = 5000000
    _INSERT_DATA_BLOCK_SIZE = 500
    
    
    def data_generator():
        ret_data = []
        for i in range(1, _TOTAL_TEST_DATA_NUMBERS + 1):
            data = {"id": i}
            ret_data.append(data)
            if len(ret_data) >= _INSERT_DATA_BLOCK_SIZE:
                yield ret_data
                ret_data.clear()
        yield ret_data
    
    
    def data_process(data):
        value = max(data, key=lambda item: item["id"])
        print("max id {}".format(value["id"]))
    
    
    if __name__ == '__main__':
        dg = data_generator()
        for d in dg:
            insert_executor.submit(data_process, d)
    
    

    data_generator,生成一个大小是 500 的数组,最大 id 是 5000000,理论上每次生成的最大 id 是能被 500 整除的。

    实际上,data_process 打印出来的 id,总是会出现类似 4855854 这样的不规则数字,和 data_generator 函数生成的数据理论上不一致,请问是什么原因?有大哥指导一下吗?

    4 条回复    2020-02-25 17:11:39 +08:00
    ccpp132
        1
    ccpp132  
       2020-02-25 16:39:37 +08:00   ❤️ 1
    ret_data.clear() 改成 ret_data = []
    理解一下引用
    JL1990
        2
    JL1990  
    OP
       2020-02-25 16:54:30 +08:00
    @ccpp132 #1 大哥,你说的好像是对的,不过这里只有一个 ret_data,怎么又和引用扯上关系了呢?
    sessionreckon
        3
    sessionreckon  
       2020-02-25 17:05:27 +08:00
    @JL1990
    线程池里还没有算完 max,对应的 ret_data 已经被修改了
    所以有问题,你不用线程池,或者 new 一个新的 list 都可以解决问题
    再说了,一个计算密集型的 max 计算用什么线程池
    JL1990
        4
    JL1990  
    OP
       2020-02-25 17:11:39 +08:00
    @sessionreckon #3 感谢,明白原因了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6007 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 03:11 · PVG 11:11 · LAX 19:11 · JFK 22:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.