Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Очереди задач без купюр, Артем Малышев, Positiv...
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
複数の Claude Code が"放置"されてしまう問題をCLI ダッシュボードを自作して解決した話
sumihiro3
1
680
Go言語とトイモデルで学ぶTransformerの気持ち / fukuokago23-transformer
monochromegane
0
170
わからない話を追いかけたら、プログラミング言語を作る側にいた
ydah
3
500
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
640
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
560
ここ半年くらいでAIに作らせたR用ツール
eitsupi
0
380
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
320
torikago - Ruby::Boxで照らすモジュラモノリスの実行境界
se4weed
1
370
言葉の格闘技のススメ~紙とペンと言葉から始める、キャリアの描き方~
progresscicada
2
140
AI時代に設計が 最大の生産性レバーになる 意図駆動開発とデータを消さない設計|Don't Delete Your Data or Your Intent — Design as the Deepest Lever in the AI Era
tomohisa
1
840
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
260
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.6k
Featured
See All Featured
VelocityConf: Rendering Performance Case Studies
addyosmani
332
25k
HDC tutorial
michielstock
2
790
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.5k
Practical Orchestrator
shlominoach
191
12k
The Curious Case for Waylosing
cassininazir
1
450
The Pragmatic Product Professional
lauravandoore
37
7.4k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.8k
Six Lessons from altMBA
skipperchong
29
4.4k
Lightning talk: Run Django tests with GitHub Actions
sabderemane
0
230
Heart Work Chapter 1 - Part 1
lfama
PRO
8
36k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
470
Stewardship and Sustainability of Urban and Community Forests
pwiseman
0
460
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]