# Celery_Concurrency ###### tags: `celery` `celery 5.2` `python` [官方連結_Concurrency](https://docs.celeryq.dev/en/master/userguide/concurrency/eventlet.html#introduction) ## Concurrency ### Concurrency with Eventlet #### Introduction [Eveltlet](http://eventlet.net/)網頁描述它是一個針對Python的並行網路套件(concurrent networking library),允許你改變程式碼執行的方式,而不是改變寫程式的方式。 * 它使用[epoll(4)](http://linux.die.net/man/4/epoll)或[libevent](http://monkey.org/~provos/libevent/)來做[高可擴展非阻塞I/O](https://en.wikipedia.org/wiki/Asynchronous_I/O#Select.28.2Fpoll.29_loops) * [協同](https://en.wikipedia.org/wiki/Coroutine)程式確保開發人員使用類似于執行緒的程式設計阻塞樣式,但提供了非阻塞I/O的優點。 * 事件分派是隱式的:這意味著你可以輕鬆地從Python解釋器使用Eventlet,也可以將其作為大型應用程序的一小部分。 Celery支援Eventlet做為一種替代的execution pool的實現,某些情況下是優於perfork pool。然而,你必須要確保一個任務並不會阻塞event loop太長的時間。普遍來說,[中央處理單元受限](http://terms.naer.edu.tw/detail/1275757/)操作與Eventlet並不能很好的配合。還要注意有些套件,通常帶有C的擴展,它們並不會執行monkey patched(猴子補丁?),因此它們並不會從使用Eventlet中得到好處。如果你不確認,請參考他們的文件。舉例來說,pylibmc不允許與Eventlet合作,但當兩者都是具有C擴展的套件時,那麼psycopg2可以。 prefork pool可以使用multiple processes,但每個cpu通常限制在少數幾個processes內。使用Eventlet你可以有效率的產生成千上百個綠色執行緒(green threads)。在一個帶有feed hub系統的非正式測試,Eventlet pool可以獲取並處理每秒上百個[饋送](http://terms.naer.edu.tw/detail/2368334/),而prefork pool花了14秒處理100個[饋送](http://terms.naer.edu.tw/detail/2368334/)。注意,這是非同步I/O尤其擅長的應用程式之一(非同步HTTP請求)。你可能希望同時使用Eventlet和prefork worker,並根據相容性或最有效的工作方式來路由任務。 #### Enabling Eventlet 你可以透過使用Worker選項[celery worker -P](https://docs.celeryq.dev/en/master/reference/cli.html#cmdoption-celery-worker-P)來啟用Eventlet pool。 ```shell $ celery -A proj worker -P eventlet -c 1000 ``` #### Examples 有關使用Eventlet支援的一些範例,請參考Celery發行版中的Eventlet[範例目錄](https://github.com/celery/celery/tree/master/examples/eventlet)。 ## History 20191015_依據4.4版本說明翻譯 20220523_依據5.2版本說明翻譯
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up