рдЕрдЬрд╡рд╛рдЗрди + рдПрд╕рд┐рдВрд╕реАрдУ

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЕрдЬрд╡рд╛рдЗрди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред

KDPV

рдкрд░рд┐рдЪрдп


рдЕрдЬрд╡рд╛рдЗрди рдПрдХ рдЬрдЯрд┐рд▓ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рднрд╛рд░реА рдмреЛрдЭ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдЕрдЬрдЧрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдореБрдЦ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдирд┐рд░реНрдгрдп рдХрд┐рдП рдЧрдП рдереЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдЖрдк рдЕрдЬрд╡рд╛рдЗрди рдХрд╛рд░реНрдп рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдмреЛрд░ рдореЛрдб рдСрди
#839. . mode off.

рд╡реЗрдирд┐рд▓рд╛ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ asyncio рдХрд╛рд░реНрдп рдЪрд▓рд╛рдПрдБ


рдЖрдк рдмреЙрдХреНрд╕ рд╕реЗ asyncio рдХрд╛рд░реНрдп рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

import asyncio

from .celeryapp import celeryapp


async def async_task():
    await asyncio.sleep(42)


@celeryapp.task
def regular_task():
    coro = async_task()
    asyncio.run(coro)

рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн:

  • рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИрдВ!
  • рдХреЗрд╡рд▓
  • рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?

  • рдИрд╡реЗрдВрдЯ рд▓реВрдк рдкреНрд░рддреНрдпреЗрдХ рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рдЕрдВрджрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдХреЛрд░рдЯрд╛рдЗрди рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рдХреЛрдИ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рдирд╣реАрдВ рд╣реИ
  • рдПрдХ рд╕рдордп рдореЗрдВ, рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдХреЛрд░рдЯрд╛рдЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ
  • рд╕рд╛рдЭрд╛ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ

рдпрд╣реА рд╣реИ, рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ asyncio рдХрд╛ рдЙрдкрдпреЛрдЧ asyncio рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреЛрдИ рд▓рд╛рдн рдирд╣реАрдВ рд╣реИрдВ

рдЪрд▓рд┐рдП рдЯреНрд░рд┐рдХрд┐рдпрд░ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ?


рдореИрдВрдиреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдВрдШрд░реНрд╖ рдХрд┐рдпрд╛:

import asyncio
import threading

from .celeryapp import celeryapp

celeryapp.loop = asyncio.get_event_loop()
celeryapp.loop_runner = threading.Thread(
    target=celeryapp.loop.run_forever,
    daemon=True,
)
celeryapp.loop_runner.start()

async def async_task():
    await asyncio.sleep(42)


@celeryapp.task
def regular_task():
    coro = async_task()
    asyncio.run_coroutine_threadsafe(
        coro=coro,
        loop=celeryapp.loop,
    )

рдмрд┐рдВрдЧреЛ! рдкреЗрд╢реЗрд╡рд░реЛрдВ:

  • рдХрд░ рд░рд╣реА рд╣реИ
  • рдЗрд╕рд╕реЗ рднреА рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рдкреНрд░рднрд╛рд╡реА
  • рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рдВрд╕рд╛рдзрди рдХрд╛рд░реНрдпрдХрд░реНрддрд╛ рдХреЗ рднреАрддрд░ рдХреЛрд░рдЯрд╛рдЗрди рдХреЗ рдмреАрдЪ рдлреЗрд░рдмрджрд▓ рдХрд░рддреЗ рд╣реИрдВред
  • рдЕрднреА рднреА рдХреЛрдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдмрд╛рд╣рд░реА рдирд┐рд░реНрднрд░рддрд╛ рдирд╣реАрдВ рд╣реИрдВ

рдмрд┐рдВрдЧреЛ? рдЖрдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереА:

  • рдЕрдЬрд╡рд╛рдЗрди рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЬрд╡рд╛рдЗрди рдХреЛ рдХреБрдЫ рднреА рдкрддрд╛ рдирд╣реАрдВ рд╣реИ
  • рдЖрдк рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВ
  • рдЖрдк рдЕрдкрд╡рд╛рджреЛрдВ рдкрд░ рдирд┐рдпрдВрддреНрд░рдг рдЦреЛ рджреЗрддреЗ рд╣реИрдВ
  • рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ

рдареЗрд╕ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЕрджреНрднреБрдд рдЗрдВрдЬреАрдирд┐рдпрд░рд┐рдВрдЧ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдЬрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореЗрд░рд╛ рд╣рд╛рде рдХрд┐рд╕реА рддрд░рд╣ рдирд╣реАрдВ рдмрдврд╝рд╛

рд╕рдорд╕реНрдпрд╛ рдХрд╛ рдирд┐рд░реВрдкрдг


  • рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • Coroutines рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
  • рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдХрдИ рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рдХреЗ рдмреАрдЪ рд╕рд╛рдЭрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдХреЛрдИ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдирд╣реАрдВ
  • рд╕рд┐рдВрдкрд▓ рдкреНрд░реЗрдбрд┐рдХреНрдЯреЗрдмрд▓ рдПрдкреАрдЖрдИ

рдпрд╣реА рд╣реИ, рдореЗрд░реА рдЙрдореНрдореАрджреЗрдВ:

import asyncio

from .celeryapp import celeryapp


@celeryapp.task
async def async_task():
    await asyncio.sleep(42)

рд╕рд╛рд░рд╛рдВрд╢


рдореИрдВрдиреЗ рд╕реЗрд▓реЗрд░реА-рдкреВрд▓-рдПрд╕рд┐рдВрд╕реАрдУ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ ред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╣рдорд╛рд░реА рдЯреАрдо рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╣рдо рдкрд╣рд▓реЗ рд╣реА рдареЗрд╕ рд╕реЗ рд▓реБрдврд╝рдХ рдЪреБрдХреЗ рд╣реИрдВред

рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╕реБрд╡рд┐рдзрд╛рдПрдБ


Asyncio рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реАрдзреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЬрд╡рд╛рдЗрди-рдкреВрд▓-asyncio рднреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

  • рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдХрд╛рд░реНрдп рд╢реЗрдбрд┐рдВрдЧ
  • рдЕрдЬрд╡рд╛рдЗрди рдХреЗ рд╕рдВрдХреЗрддреЛрдВ рдореЗрдВ Corutin рдХрд╛ рд╕рдорд░реНрдерди

рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдЬрд╡рд╛рдЗрди-рдкреВрд▓-рдПрд╕рд┐рдВрд╕реАрдУ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдмрдВрджрд░ рдкреИрдЪрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ ред рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдкреИрдЪ рдХреЗ рд▓рд┐рдП, рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИред

рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдЗрд╕ рд╕рдм рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред

рдпреЛрдЬрдирд╛рдУрдВ


рдПрдХ рдЕрдЪреНрдЫреЗ рддрд░реАрдХреЗ рд╕реЗ, рдЖрдкрдХреЛ рдкреВрд▓ рдХреЛ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЕрдЬрд╡рд╛рдЗрди рдХреЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЕрдЬрд╡рд╛рдЗрди 5.0 рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛ред рдЦреЗрд▓ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?

рдЙрджрд╛рд╣рд░рдг


рдореЗрд░реЗ рдЕрдЬрд╡рд╛рдЗрди-рдкреВрд▓-рдПрд╕рд┐рдВрд╕реАрдУ рдФрд░ рдЕрдЬрд╡рд╛рдЗрди-рдбреЗрдХреЛрд░реЗрдЯрд░-рдЯрд╛рд╕реНрдХрдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА ( рд▓реЗрдЦ ) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА ред

рдЕрдиреНрдп


рдореИрдВрдиреЗ рдорд┐рддрдк рдкрд░ рд╡рд╣реА рдмрд╛рдд рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА


All Articles