V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
lecher23
V2EX  ›  Python

celery worker 资源初始化的问题

  •  
  •   lecher23 ·
    lecher23 · 2017-09-25 15:22:06 +08:00 · 2372 次点击
    这是一个创建于 2617 天前的主题,其中的信息可能已经有所发展或是发生改变。
    Hi,请教大家一个问题:
    由于异步的 celery 任务依赖 MySQL 连接以及 Redis 连接,因此需要在 worker 启动后初始化这些连接信息,但是看网上的文档,celery 的 worker 启动的时候使用的是 prefork 的方式,如果初始化连接太早会导致多个进程使用的是同一个 MySQL 和 Redis 连接,这样因该是有问题的,那么各位都是在什么时候初始化连接的呢?
    3 条回复    2017-09-30 11:08:14 +08:00
    rogwan
        1
    rogwan  
       2017-09-25 15:43:47 +08:00 via Android
    orm
    julyclyde
        2
    julyclyde  
       2017-09-26 08:14:51 +08:00
    没啥问题啊,就该使用同一个
    初始化部分不归你管,你写不了什么的
    wcsjtu
        3
    wcsjtu  
       2017-09-30 11:08:14 +08:00   ❤️ 1
    prefork 模式只是先 spawn 出子进程,这时候子进程就像一个空的 python interpreter。 然后你的代码会在每个子进程中 load 一次, 所以说每个子进程中的连接是独立的。
    mysql 的话,如果你使用了连接池,可以用 `show full processlist;`来查看当前的连接, 根据里面的端口查找进程, 你会发现 celery 各个子进程都有自己的连接。

    redis 的话,如果你的 redis 是用作 broker 的,那么子进程是不会直接连到 broker 的。如果 redis 用作业务存储,那么与 mysql 类似。

    所以,问题答案`什么时候初始化连接的呢?`—— 依赖于你代码的实现
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   888 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:27 · PVG 04:27 · LAX 12:27 · JFK 15:27
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.