开发者社区> 问答> 正文

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),请问应该怎么改?

展开
收起
海边一只船 2020-05-28 13:31:11 1886 0
2 条回答
写回答
取消 提交回答
  • 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)
    
    
    2020-05-29 19:07:21
    赞同 展开评论 打赏
  • 子进程会共享父进程的数据,子进程的运行完全独立,所以没办法修改父进程的变量。

    2020-05-29 17:18:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
From Python Scikit-Learn to Sc 立即下载
Data Pre-Processing in Python: 立即下载
双剑合璧-Python和大数据计算平台的结合 立即下载