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

来源:11-10 multiprocessing 多进程编程

起航Go

2021-03-24

图片描述
图片是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的好多资料,都没有找到相关说明。。。

写回答

1回答

bobby

2021-03-25

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

0
2
bobby
回复
起航Go
rabbitmq中直接存放 代码, 你可以留个qq 我加你看看
2021-03-27
共2条回复

Python3高级核心技术97讲,高级进阶的必学课程

socket编程/多线程/多进程/线程池/asyncio并发编程/协程和异步IO

2121 学习 · 551 问题

查看课程