2013-03-25 24 views
19

Python gevent ile çalışmaya başladım ve kütüphanenin cpu/mulitcore kullanımını merak ettim.Gevent çok çekirdekli kullanım

Bazı örnekler örneklemiş urllib aracılığıyla birçok istekte bulunarak denedim,% 99 yük kullanarak sadece bir çekirdek üzerinde çalışıyorlardı fark ettim.

Tüm çekirdekleri python kullanarak nasıl kullanabilirim? En iyi uygulama var mı? Ya da birden çok süreç ve gevent kullanarak herhangi bir yan etkisi var mı?

BR dan

cevap

47

Gevent size engelleme istekleri ile başa çıkmak için yeteneği sağlar. Size çok çekirdekli çalışma yeteneği vermez.

Herhangi bir anda bir python işleminde çalışan yalnızca bir yeşil (gevent'ın coroutini) var. Gevent'in asıl avantajı, G/Ç darboğazları ile uğraşırken (genel web uygulamaları, API uç noktaları sağlayan web uygulamaları, web tabanlı sohbet uygulamaları veya arka uç ve genel olarak ağ uygulamaları) uğraşırken çok güçlü olmasıdır.). Bazı CPU-ağır hesaplamalar yaptığımızda, gevent kullanarak no performans-kazanç olacaktır. Bir uygulama G/Ç bağlı olduğunda, gevent salt bir sihirdir. Greenlets bir I/O-operasyon engelleyecek her uzağa açık olsun veya açıkça anahtarı ne zaman (örneğin ile gevent.sleep())

yerleşik piton parçacığı aslında:

basit bir kural vardır Gevent'in yeşilleri ile aynı (sözde) "eşzamanlı" şekilde davranır.

Buradaki en önemli fark şudur: yeşil alanlar, iş parçacıklarının çok işlemli çoklu görevler kullandığı, kooperatif çoklu görevini kullanır. Bunun anlamı, bir greenlet'in, belirli "verim" işlevlerini kullanmadığı sürece (gevent.socket.socket.recv veya gevent.sleep gibi) başka bir yeşile aktarılması ve "verim" etmemesidir. Diğer taraftan, iş parçacıkları, işletim sisteminin takas etmeye karar vermesine bağlı olarak diğer iş parçacıklarına (bazen öngörülemeyen bir şekilde) yol açacaktır.

Ve nihayet, Python çoklu çekirdek kullanmasına - Eğer istediğin buysa - biz çoklu işlem modülüne bağlıdır zorunda (ki Python yerleşik bir modüldür). Bu "GIL civarında" alır. Diğer alternatifler arasında Jython kullanımı veya görev sırasını kullanarak görevleri (farklı CPU'larda) paralel olarak yürütme, ör. Zeromq.

Burada çok uzun bir açıklama yazdım - http://learn-gevent-socketio.readthedocs.org/en/latest/. Eğer ayrıntılara dalmayı önemsiyorsanız. : -D

+2

Bunu duruma göre, birkaç Python işleminin gevent ile çalıştırılması iyi bir çözüm olabilir. Elbette süreçlerin birbirleriyle önemli miktarda iletişim kurması gerektiğinde bu bir seçenek değildir. – ferrix

+0

Cevabınız için teşekkürler. İstediğim, makinede olabildiğince çok sayıda G/Ç işlemi yapmak. Soru şudur: n süreçlerini (thread değil) kullanarak n = cpu_cores kullanarak veya daha hızlı alabileceği tek bir süreçle daha fazla istekler verebiliyor muyum? – thesonix

+1

trunk.ly (Alex Dong'un sözleriyle), G/Ç bağlı ve CPU'ya bağlı bir sorunla uğraşır (siteleri tarar ve taranan içeriği bir arama dizinine yerleştirir) - https://groups.google .com/d/msg/gevent/4hR1P6Vd-uk/4A4bw5ynuucJ –

İlgili konular