星风雪宇 2020-04-25 19:46 采纳率: 100%
浏览 962
已采纳

Python多进程修改共享变量的问题

from multiprocessing import Pool,freeze_support,Lock
import time
cnt=0
lock=Lock()
def test(item):
    with lock:
        global cnt
        time.sleep(1)
        cnt=cnt+1
if __name__=='__main__':
    freeze_support()
    start=time.time()
    pool=Pool()
    pool.map(test,range(0,10))
    pool.close()
    pool.join()
    print(cnt)
    print(time.time()-start)

用python开多进程执行某个test任务,test任务简化为一个延时操作,每进行一次test就让共享变量加1,使用了multiprocessing中的锁Lock()来解决数据竞争的问题,发现无法解决,每次print的cnt值还是0(如果成功解决数据竞争问题的话cnt最后应该是10),请问应该怎么改?

  • 写回答

4条回答 默认 最新

  • 吃鸡王者 2020-04-26 14:37
    关注

    多线程共享变量一般这么写:

    from multiprocessing import freeze_support,Lock,Process,Value
    import time
    
    cnt=Value('i',0)
    lock=Lock()
    
    def my_test(cnt,lock):
        with lock:
            time.sleep(1)
            cnt.value+=1
            print(cnt.value)
    if __name__=='__main__':
        freeze_support()
        ps=[Process(target=my_test,args=(cnt,lock)) for i in range(10)]
        start=time.time()
        for p in ps:
            p.start()
        for p in ps:
            p.join()
        print(cnt.value)
        print(time.time()-start)
    
    

    建议:pool个人认为一般用相对独立的并行处理,个进程之间几乎没有交集,所以对于共享变量建议还是不要用pool,
    还有就是,在windos系统下,pool对自定义的方法,一般会报错(需要将自定义的函数在另一个文件中定义,用import导入后使用),所以你的代码里其实各个子进程都没有执行,详情你可以在一个shell里边逐行
    运行检查一下。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料