[Pythhon] 비동기 작업의 실행 환경 만들기 + 모니터링 환경

11421 단어 CeleryPython

이것은 무엇이냐


때로는 임무를 대열에 잘 저장하고 스태프로 가볍게 처리하고 싶을 때가 있다.
계산 임무라든지 대량의 디버깅 작업이라든지.
그런 팀을 만들 때 파이톤celery이면 편해요.

골대


이걸 읽은 사람은 파이톤으로 간단하게 비동기 처리의 구조를 실현하고 상황을 감시할 때까지
할 수 있는 일.

준비물

  • redis 서버(스토리지에서 작동하는 취약성 KVS)
  • celery
  • flower(celery의extention에서 감시하는 녀석)
  • apt-get install redis-server
    pip install celery
    pip install flower
    

    최소한의 구성 요소


    main.py

    import tasks
    
    print('<first task>')
    # ここでタスク起動 (runタスク)
    worker = tasks.run.delay()
    # 終わらぬなら終わるまで待とうホトトギス
    while not worker.ready():
        pass
    # 返り値をだす
    print worker.result
    
    print('<second task>')
    # ここでタスク起動 (calcタスク)
    worker = tasks.calc.delay(100, 200)
    # 終わらぬなら終わるまで待とうホトトギス
    while not worker.ready():
        pass
    # 返り値をだす
    print worker.result
    

    tasks.py


    비동기 처리를 할 임무를 함수에 모아 @task에 시뮬레이터를 추가한 후
    셀리부터 칠 수 있어요.
    매개 변수·환산 값의 교차,celery의 시리아 레사는 잘 한다.
    자제류의 실례 등은 엄숙할 수 없으니 주의하세요.
    import time
    from celery.decorators import task
    
    @task
    def run():
        time.sleep(10)
        print('処理 おわた')
        return 'おわったよ'
    
    
    @task
    def calc(a, b):
        return a+b
    
    

    celeryconfig.py


    celery 이동에 사용되는 설정 파일입니다.기본적으로 스태프 주변의 데이터 교환은
    json으로 하고 싶어서 임무·결과가 교차하는 시리아 레이저관'json'을 지정했습니다.
    백엔드(BROKER)는 Redis로 이동하지만 RabbitMQ를 사용할 수도 있습니다.
    스케줄러:그건자네에게맡길게.
    다음 예에서 스태프는tasks입니다.py를 읽습니다.비동기적으로 처리할 함수
    포함된 모든 스크립트를 지정합니다.
    CELERYD_LOG_LEVEL을 INFO로 설정하면 작업의 표준 출력도 기록됩니다(celeryd.log).
    쓰여 있다.프로덕션에서 ERROR 같은 것을 미리 설정하는 것이 좋습니다.
    ※ 그나저나 셀레리드는LOG_전설에 의하면 LEVEL이 Duplicate가 되었다고 한다.
    CELERYD_콘서트 런시=1 때문에 대열을 하나씩 팔았다. 
    여기 CPU 개수에 맞는 게 좋겠죠?
    BROKER_URL = 'redis://localhost/0'
    CELERYD_CONCURRENCY = 1
    CELERY_RESULT_BACKEND = 'redis'
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_ACCEPT_CONTENT = ['json']
    CELERY_RESULT_BACKEND = "redis"
    CELERYD_LOG_FILE = "./celeryd.log"
    CELERYD_LOG_LEVEL = "INFO"
    CELERY_IMPORTS = ("tasks", )
    

    가동 방법


    redis-server 시작


    우선 Redis-server를 시작합시다.(필수)
    서비스 시작한 사람 건너뛰기.
    $ redis-server
    

    celeryworker 시작


    이렇게 되면 스태프들이 대열을 처리할 준비를 할 수 있을 거예요.
    (env) docker@1824542bb286:~/workspace$ celery worker
    /home/docker/.virtualenvs/env2/local/lib/python2.7/site-packages/celery/app/defaults.py:251: CPendingDeprecationWarning:
        The 'CELERYD_LOG_LEVEL' setting is scheduled for deprecation in     version 2.4 and removal in version v4.0.     Use the --loglevel argument instead
    
      alternative='Use the {0.alt} instead'.format(opt))
    /home/docker/.virtualenvs/env2/local/lib/python2.7/site-packages/celery/app/defaults.py:251: CPendingDeprecationWarning:
        The 'CELERYD_LOG_FILE' setting is scheduled for deprecation in     version 2.4 and removal in version v4.0.     Use the --logfile argument instead
    
      alternative='Use the {0.alt} instead'.format(opt))
    
     -------------- celery@1824542bb286 v3.1.23 (Cipater)
    ---- **** -----
    --- * ***  * -- Linux-3.13.0-24-generic-x86_64-with-Ubuntu-14.04-trusty
    -- * - **** ---
    - ** ---------- [config]
    - ** ---------- .> app:         default:0x7f068383f610 (.default.Loader)
    - ** ---------- .> transport:   redis://localhost:6379/0
    - ** ---------- .> results:
    - *** --- * --- .> concurrency: 1 (prefork)
    -- ******* ----
    --- ***** ----- [queues]
     -------------- .> celery           exchange=celery(direct) key=celery
    
    
    [tasks]
      . tasks.run
    

    실제로 대열에 넣어볼게요.


    비동기 처리
    docker@1824542bb286:~/workspace$ python main.py
    <first task>
    おわったよ
    <second task>
    300
    

    flower를 통한 작업 모니터링


    flower 시작

    (env2) docker@1824542bb286:~/workspace$ celery flower
    /home/docker/.virtualenvs/env2/local/lib/python2.7/site-packages/celery/app/defaults.py:251: CPendingDeprecationWarning:
        The 'CELERYD_LOG_LEVEL' setting is scheduled for deprecation in     version 2.4 and removal in version v4.0.     Use the --loglevel argument instead
    
      alternative='Use the {0.alt} instead'.format(opt))
    /home/docker/.virtualenvs/env2/local/lib/python2.7/site-packages/celery/app/defaults.py:251: CPendingDeprecationWarning:
        The 'CELERYD_LOG_FILE' setting is scheduled for deprecation in     version 2.4 and removal in version v4.0.     Use the --logfile argument instead
    
      alternative='Use the {0.alt} instead'.format(opt))
    [I 160617 13:02:20 command:136] Visit me at http://localhost:5555
    [I 160617 13:02:20 command:141] Broker: redis://localhost:6379/0
    [I 160617 13:02:20 command:144] Registered tasks:
        ['celery.backend_cleanup',
         'celery.chain',
         'celery.chord',
         'celery.chord_unlock',
         'celery.chunks',
         'celery.group',
         'celery.map',
         'celery.starmap',
         'tasks.run']
    [I 160617 13:02:20 mixins:231] Connected to redis://localhost:6379/0
    

    액세스 인터페이스


    기본적으로 localhost:55555는 flower(감시 인터페이스)의 URL입니다.
    감시는 물론 직원 수도 조절할 수 있어 편리하다.

    좋은 웹페이지 즐겨찾기