рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдпрд╣ рдмрддрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рдореИрдВрдиреЗ рдЕрдЬрд╡рд╛рдЗрди рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдкреНрд░рднрд╛рд╡реА рдкреНрд░рддрд┐рд╕реНрдкрд░реНрдзреА рдирд┐рд╖реНрдкрд╛рджрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ред
рдкрд░рд┐рдЪрдп
рдЕрдЬрд╡рд╛рдЗрди рдПрдХ рдЬрдЯрд┐рд▓ рдЗрддрд┐рд╣рд╛рд╕ рдФрд░ рдкрд┐рдЫрдбрд╝реЗ рд╕рдВрдЧрддрддрд╛ рдХреЗ рднрд╛рд░реА рдмреЛрдЭ рдХреЗ рд╕рд╛рде рдПрдХ рдмрдбрд╝реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╣реИред рдЕрдЬрдЧрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкреНрд░рдореБрдЦ рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рдирд┐рд░реНрдгрдп рдХрд┐рдП рдЧрдП рдереЗред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдХрд┐рд╕реА рддрд░рд╣ рдЖрдк рдЕрдЬрд╡рд╛рдЗрди рдХрд╛рд░реНрдп рдХреЛ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВредрдмреЛрд░ рдореЛрдб рдСрди рд╡реЗрдирд┐рд▓рд╛ рдЕрдЬрд╡рд╛рдЗрди рдореЗрдВ 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 рдХрд╛ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рд╣реЛрдЧрд╛ред рдЦреЗрд▓ рдореЛрдордмрддреНрддреА рдХреЗ рд▓рд╛рдпрдХ рд╣реИ?рдЙрджрд╛рд╣рд░рдг
рдореЗрд░реЗ рдЕрдЬрд╡рд╛рдЗрди-рдкреВрд▓-рдПрд╕рд┐рдВрд╕реАрдУ рдФрд░ рдЕрдЬрд╡рд╛рдЗрди-рдбреЗрдХреЛрд░реЗрдЯрд░-рдЯрд╛рд╕реНрдХрдХреНрд▓рд╛рд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА ( рд▓реЗрдЦ ) рдХреА рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рдПрдХ рдкрд░реАрдХреНрд╖рдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рд▓рд╛рдЧреВ рдХреА рдЧрдИ рдереА редрдЕрдиреНрдп
рдореИрдВрдиреЗ рдорд┐рддрдк рдкрд░ рд╡рд╣реА рдмрд╛рдд рдХрд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА