2011-11-29 28 views
7

Python'da, bir işlemin hangi CPU üzerinde çalıştığını öğrenmenin bir yolu var mı? Örneğin, farklı işlemler için farklı işlemler oluşturursam, çoklu işlem modülünü kullanarak, her işlemin çalıştığı çekirdeği tanımlamak mümkün mü?Python çok işlemcili programlama

+1

Programlı veya OS aracılığıyla? OS ise, o zaman hangi işletim sistemi? – jzila

+0

Programsal veya OS ile ne demek istiyorsun? Programın içinden veya dışından geliyorsanız, programın içinden istiyorum. Örneğin os.getpid() ile işlem kimliğini alabilirim, bu işlemin çalıştığı CPU'yu bulmak için benzer bir şey yapabilir miyim. –

+0

Btw. Neden ilk başta CPU numarasını bulmak istersiniz? Neyi başarmaya çalışıyorsun? – jsalonen

cevap

1

Bunun bir süreç bir çekirdek ile sınırlı olmadığı için güvenilir bir şekilde yapılabileceğini düşünmüyorum. Bir işlem bir veya daha fazla çekirdek üzerinde çalışabilir (iş parçacığı kullanırsa) ve yürütmek için kullanılan çekirdekler, iş yükünü dengelemeye çalıştıkça zaman içinde değişebilir.

İşlemle ilgili bilgi almanın iyi bir yolu olarak psutil kitaplığına bakın.

3

Kısa cevap

Hayır, bu mümkün değildir.

genel durumda Uzun cevap

yapamayacağınız işlemler belirli çekirdek bağlı olmayan beri. İşlemler, her zaman çalışacakları garantili sabit CPU'lara sahip değildir: belirli bir süreçte belirli bir işlemi çalıştırmak için hangi çekirdeğin kullanılacağına karar vermek işletim sistemine bağlıdır. Bu karar verme, scheduling olarak adlandırılır ve uygulanması OS'ye özeldir. Belirli işletim sistemlerinde, belirli işlemlerin çıkması için işlemcilerin nasıl kullanıldığını kontrol edebilecek durumda olabilirsiniz. Tercih edilen işlemcilerin atanması genellikle processor affinity olarak adlandırılır. Olumsuzluğun ayarlanması bile, verilen çekirdekler üzerinde her zaman bir işlemin yürütüleceğini garanti etmez: en sonunda programlamanın nasıl yürütüldüğüne karar vermek için OS'ye (ve CPU'ya) bağlıdır.

Bildiğim tüm işletim sistemlerinden, en yakın şey, Linux'un "çağıran parçanın çalıştığı CPU'yu belirlemek için" kullanılabilen sched_getcpu olacaktır (bkz. man sched_getcpu). Mevcut CPU'yu bu işlevle kontrol ettiğinizde bile, çekirdek çekirdeği hemen değiştirebilir. Gerekirse piton koduyla bunları bağlayabilir,

+1

İşlem benzeşiminin ayarlanması ve sorgulanması için bir çapraz platform çözümü bulunup bulunmadığını bilmiyorum. Windows'da, [SetProcessAffinityMask] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms686223%28v=vs.85%29) numaralı telefonu arayarak belirli bir çekirdek kümesine işlem yakınlığını ayarlayabilirsiniz. aspx) biraz vektör ile. – eryksun

+0

Ben de var sanmıyorum. PyPi'den, “afinite 0.1.0” (http://pypi.python.org/pypi/affinity), Windows'ta ve bazı belirli Linux çekirdeklerinde afinite işlevleri için sarmalayıcılar sağladığını belirttim.Yine de denemedim ve bu kütüphane bile, kendi başına, belirli bir CPus'a bağlı süreçlerin yanlış anlaşılmasına dayanan, verilen probleme tam bir çözüm sunmazdı. – jsalonen

+0

İşlemlerin belirli CPU'lara bağlı olmama nedenlerinin belirli zaman aralıklarında hangi CPU'ların çalıştırıldığını görmemize izin vermediğini görmüyorum. İşlemi hangi CPU'nun çalıştırdığını kontrol edemiyorum, örneğin her 10 saniyede bir? –

İlgili konular