Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Очереди задач без купюр, Артем Малышев, Positiv...
Search
IT-People
July 25, 2016
Programming
120
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Очереди задач без купюр, Артем Малышев, Positive Technologies
Выступление на конференции PyCon Russia 2016
IT-People
July 25, 2016
More Decks by IT-People
See All by IT-People
Александр Кошкин, Positive Technologies: Знай и люби свой CPython во имя луны и великой справедливости
itpeople123
1
210
How Python was Shaped by leaky Internals, Armin Ronacher, Flask framework
itpeople123
1
240
Building social network with Neo4j and Python, Андрей Солдатенко, Toptal
itpeople123
1
240
Осторожно, DSL! Иван Цыганов, Positive Technologies
itpeople123
0
130
Докеризация веб-приложения на Python Антон Егоров, Ostrovok.ru
itpeople123
0
200
Python Robot Operating System вместо Middleware framework Дмитрий Киселев, Endpoint.com
itpeople123
0
120
Falcon — очередная WSGI библиотека? Дмитрий Кукушкин, Wargaming
itpeople123
0
290
Flame graph: новый взгляд на привычное профилирование, Кирилл Борисов, Яндекс
itpeople123
1
270
Как добавить scripting в веб приложение, Константин Лопухин, Scrapinghub
itpeople123
0
150
Other Decks in Programming
See All in Programming
VueプロジェクトをTypeScript7に対応させる- Side-by-Side戦略による一部高速化 -
koukimiura
0
110
Vibes Containers 〜AIで変わるコンテナ設計と運用〜
tkikuc
3
540
TiDB Cloudのカスタムコントローラーによるオートスケール対応
takaidohigasi
0
110
自分的「カンファレンスの楽しみ方」
syumai
0
200
Are APIs Still Relevant in the AI Era?
soyuka
0
150
Security issues being discussed on Web Platforms
petamoriken
0
910
DroidKaigi 2026 「個人開発という実験場: Android エンジニアが手にする4つの自由」
slashnephy
0
230
[DroidKaigi 2026] Bring your own phones to Gradle Managed Devices
f2lk
0
120
仕様駆動開発による爆速プロダクト開発 / Bakusoku Spec Driven Development
kobakei
0
110
モジュールの視点からSwiftを読み解く #iosdc
s_shimotori
0
170
大喜利で理解するLLM as a Judge / Understanding LLM-as-a-Judge through Ogiri
rockname
0
100
thread_parallel_with_free-threaded_Python_and_NumPy.pdf
riku_sakamoto
0
330
Featured
See All Featured
Designing for humans not robots
tammielis
254
26k
Test your architecture with Archunit
thirion
2
2.4k
The agentic SEO stack - context over prompts
schlessera
0
940
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
980
Between Models and Reality
mayunak
4
460
The Cost Of JavaScript in 2023
addyosmani
55
10k
Side Projects
sachag
456
43k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
280
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
350
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
520
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
330
Transcript
TASK QUEUES UNCUT МАЛЫШЕВ АРТЁМ
None
None
None
None
CELERY app = Celery(__name__) @app.task def add(x, y): return x
+ y add.delay(1, 2)
RQ def add(x, y): return x + y queue =
rq.Queue('default') queue.enqueue(add, 1, 2)
RABBITMQ QUEUES Name Ready Unacked Total celery 1 0 1
PAYLOAD { "task": "app.add", "args": [1, 2], "kwargs": {}, "id":
"27ebcaee-444f-4379-a438-04c3b5bb0fc3", "callbacks": null, "errbacks": null, "eta": null, "expires": null, "timelimit": [null, null], "taskset": null, "chord": null, "retries": 0 }
REDIS QUEUES >>> KEYS * 1) "celery" >>> LRANGE celery
0 -1 1) { "properties": { "body_encoding": "base64", "delivery_info": { "exchange": "celery", "routing_key": "celery" } }, "body": "eyJ0aW1lbGltaXQiOiBbbnVsb...", "content-type": "application/json" }
RQ >>> SMEMBERS rq:queues 1) "rq:queue:default" >>> LRANGE rq:queue:default 0
-1 1) "be58515f-9f330470995d" >>> HGETALL rq:job:be58515f-9f330470995d 1) "status" "queued" 2) "enqueued_at" "2016-06-14T19:45:39Z" 3) "created_at" "2016-06-14T19:45:39Z" 4) "origin" "default" 5) "description" "lib.add(1, 2)" 6) "data" "\x80\x04\x95\x17\x00\x00..." 7) "timeout" "180"
ACCEPT TASK # celery $ celery -A myapp worker -Q
queue1,queue2 # rq $ rq worker queue1 queue2
RABBITMQ QUEUES Name Ready Unacked Total celery 0 1 1
REDIS QUEUES >>> KEYS * 1) "celery" 2) "unacked" 3)
"unacked_index" 4) "unacked_mutex" >>> HGETALL unacked 1) "13ce9ff2-c596-4471" "[{...}, \"celery\", \"celery\"]"
RQ >>> HGETALL rq:job:be58515f-9f330470995d 1) "status" "started" 2) "enqueued_at" "2016-06-14T19:45:39Z"
3) "created_at" "2016-06-14T19:45:39Z" 4) "origin" "default" 5) "description" "lib.add(1, 2)" 6) "data" "\x80\x04\x95\x17\x00..." 7) "timeout" "180" 8) "started_at" "2016-06-14T21:21:14Z" >>> ZRANGE rq:wip:default 0 -1 WITHSCORES 1) "be58515f-9f330470995d" "1465939514"
FRAGILE ACKNOWLEDGMENT
RPOPLPUSH LUA SCRIPTS
None
None
None
TASK EXECUTION # celery def trace_task(uuid, args, kwargs, request=None): R
= retval = fun(*args, **kwargs) # rq class Job: def perform(self): self._result = self.func( *self.args, **self.kwargs)
CONCURRENCY ✓ gevent ✗ twisted ✗ tornado ✗ asyncio
None
None
None
None
None
CALLBACK app.add.apply_async((1, 2), link=app.mul.s(3)) PAYLOAD "callbacks": [ { "task": "app.mul",
"args": [3], "kwargs": {}, "options": {}, "chord_size": null, "immutable": false, "subtask_type": null } ]
CHAINS c = chain(app.add.s(1, 2), app.add.s(3), app.mul.s(6)) c()
RQ DEPENDENTS job = q.enqueue(lib.add, 1, 2) delayed = q.enqueue(lib.add,
1, 2, depends_on=job) REDIS >>> SMEMBERS rq:job:1183256d-2cf952c76:dependents 1) "00b70a47-bba9051bd7da" >>> HGETALL rq:job:00b70a47-bba9051bd7da 1) "status" "deferred" 2) "dependency_id" "1183256d-2cf952c76"
GROUPS g = group(app.add.s(1, 2), app.mul.s(3, 4)) g()
CHORD ch = chord([app.add.s(1, 2), app.add.s(3, 4)]) ch(app.mul.s(5)) PAYLOAD "chord":
{ "task": "app.mul", "chord_size": 3, "args": [7], "kwargs": null, "options": { "task_id": "2f0f2a7f-e249828b3fc9", "reply_to": "a53cb689-85a86c447428" } }
None
None
Celery: Redis as a broker deprecated in 4.0 Ask Solem
(@asksol) June 28, 2016 So I’m late for work, and seems like Redis as a broker is no longer deprecated :) Ask Solem (@asksol) June 28, 2016
None
THANKS
[email protected]