请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

python多进程和celery中多进程关于global变量的问题

图片描述
图片是celery日志。

from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    print('Run task %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    try:
        print 'aaa:%s' % aaa
    except:
        pass
    print('Task %s runs %0.2f seconds.' % (name, (end - start)))

def mptest():
    print('Parent process %s.' % os.getpid())
    p = Pool(8)
    global aaa
    aaa = 456
    for i in range(5):
        p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()
    print('All subprocesses done.')

if __name__=='__main__':
    mptest()

如上代码,我在mptest里声明一个全局变量aaa,然后启动5个进程去读取aaa是读取不到的,这个很好理解,因为进程间数据不能这样共享。
但是,我把上面代码中mptest函数作为celery的任务运行,在celery worker中同样是启动5个新的进程去读取aaa,是可以读取到的,不知道老师是否了解这是什么原因?我查了celery的好多资料,都没有找到相关说明。。。

正在回答 回答被采纳积分+3

1回答

bobby 2021-03-25 11:34:57

celery的代码不是在本地进程中读取的, 是将代码放入到比如rabbitmq中,然后celery启动worker以后就就去rabbitmq中读取这些代码然后执行

0 回复 有任何疑惑可以回复我~
  • 提问者 起航Go #1
    rabbitmq存放的是代码还是进程信息呢?不太理解为什么celery进程中fork出来的子进程能读取到父进程的global变量
    回复 有任何疑惑可以回复我~ 2021-03-25 11:39:32
  • bobby 回复 提问者 起航Go #2
    rabbitmq中直接存放 代码, 你可以留个qq 我加你看看
    回复 有任何疑惑可以回复我~ 2021-03-27 09:12:18
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信