Nasıl ipler Python nasıl çalışır ve ortak Python iş parçacığı özgü tuzaklar nelerdir?

oy
74

Ben ipler Python nasıl çalıştığını etrafında başımı sarmak için çalışıyorum ve bu faaliyet nasıl iyi bilgi bulmak zor. Sadece bir bağlantı veya bir şey eksik olabilir, ancak resmi belgeler konuyla ilgili çok kapsamlı değil gibi görünüyor, ve ben iyi bir değer artışı bulmak mümkün olmamıştır.

Ne anlarım itibaren sadece bir iplik seferde çalışıyor olabilir ve aktif iplik her 10 talimatlarını anahtarları ya da öylesine?

Nerede iyi bir açıklaması var ya bir tane sağlayabilir? Ayrıca Python ile konuları kullanırken girmek yaygın sorunlardan haberdar olmak çok güzel olurdu.

Oluştur 27/08/2008 saat 22:44
kaynak kullanıcı
Diğer dillerde...                            


7 cevaplar

oy
19

Aşağıda temel parçacığı örneğidir. Bu 20 mesajları üretmeyecek; Her iplik irade çıktı onun iplik numarası. Bunu çalıştırın ve onlar baskı sırasını gözlemleyin.

import threading
class Foo (threading.Thread):
    def __init__(self,x):
        self.__x = x
        threading.Thread.__init__(self)
    def run (self):
          print str(self.__x)

for x in xrange(20):
    Foo(x).start()

Python parçacığı ima gibi zaman dilimleme hayata geçirilmektedir. Bu da "paralel" efekti elde nasıl.

Benim örnekte benim Foo sınıfı iplik uzanır Sonra uygulamak runbir iş parçacığı çalıştırmak istiyorum Şifrenin nerede yöntemi. Aradığınızda parçacığı başlatmak için start()otomatik olarak çağıracağı parçacığı nesnesi üzerinde runyöntem ...

Tabii ki, bu sadece çok temel budur. Sonunda iplik senkronizasyon ve mesaj geçiş için semaforlarıyla, muteksler ve kilitleri hakkında bilgi isteyecektir.

Cevap 27/08/2008 saat 22:52
kaynak kullanıcı

oy
35

Python içinde iplik için oldukça kolay bir dildir, ama uyarılar vardır. Bilmen gereken en büyük şey Küresel Tercüman Kilidi olduğunu. Bu tercüman erişmek için tek bir iplik verir. 1) Eğer nadiren python bir kilit ifadesini kullanarak kendinizi bulmak ve çoklu işlemci sistemleri yararlanmak istiyorsanız 2), ayrı süreçler kullanmak zorunda: Bu iki anlama gelir. DÜZENLEME: Ben de siz de GIL etrafında almak istiyorsanız C / C ++ kod bazı koyabilirsiniz işaret olmalıdır.

Böylece, size konuları neden kullanmak istediğinizi yeniden dikkate almak gerekir. Eğer çift çekirdekli mimarisinin yararlanmak için uygulamanızı parallelize istiyorsanız, birden süreçlerine uygulamanızı kesiliyor dikkate almak gerekir.

Eğer tepki geliştirmek istiyorsanız, size konuları kullanmayı düşünmelisiniz. Diğer alternatifler yani gerçi vardır microthreading . Eğer dikkate almam gereken çerçeveler da vardır:

Cevap 27/08/2008 saat 23:00
kaynak kullanıcı

oy
46

Evet, Küresel Tercüman Lock (Gil) nedeniyle sadece bir seferde bir iş parçacığı vardır çalıştırabilirsiniz. İşte bu konuda bazı anlayışlar ile bazı bağlantılar:

son halkası ilginç bir alıntı Gönderen:

Beni bunun ne anlama geldiğini tüm açıklayayım. Konuları aynı sanal makinenin içinde çalışacak ve dolayısıyla aynı fiziksel makine üzerinde çalıştırın. Süreçler aynı fiziksel makine üzerinde veya başka bir fiziksel makinede çalışabilir. Eğer mimarı diş boyunca başvurunuzu, birden çok makineleri erişmek için hiçbir şey yapmadım. O halde pek çok çekirdek (zaman içinde epeyce olacaktır) tek makinede olduğu gibi şekilde ölçeklenebilir, ama gerçekten web ölçekleri ulaşmak için, yine birden makine sorunu çözmek gerekir.

Çoklu çekirdek kullanmak istiyorsanız, pyprocessing gerçek parallelization yapmak için bir süreç bazlı API tanımlar. PEP ayrıca bazı ilginç kriterler içermektedir.

Cevap 27/08/2008 saat 23:19
kaynak kullanıcı

oy
10

Bireysel işçiler G / Ç bağımlı işlemleri yapıyorsanız python konuları kullanın. Eğer bir makinede birden çekirdeğine genişleyerek ya iyi bulmak çalışıyorsanız IPC piton için bir çerçeve ya da farklı bir dil seçin.

Cevap 28/08/2008 saat 01:34
kaynak kullanıcı

oy
2

GIL çoklu görevlerin görünümünü göstermek yapmak için sık sık her etrafında yoklamaya ayarlandığını hatırlamaya çalış. Bu ayar ince ayarlı ama ipler yapıyoruz veya bağlam anahtarlarının sürü sorunlara neden olacak bu iş olmaması gerektiğini öneri sunuyoruz edilebilir.

Ben işlemciler üzerinde birden anne önermek ve aynı çekirdek (ler) işler gibi tutmaya çalışın edecek kadar ileri gider.

Cevap 28/07/2009 saat 21:40
kaynak kullanıcı

oy
3

GiL için bir kolay bir çözümdür çoklu işlem modülü. Bu parçacığı modülüne yerine bir damla olarak kullanılan ancak bunun yerine parçacığı birden Tercüman süreçlerini kullanır edilebilir. Bu nedenle orada basit şeyler için düz diş biraz daha havai ama bunu gerekirse bu size gerçek paralelleştirme avantaj sağlar. Ayrıca kolayca birden çok fiziksel makinelere ölçekler.

Eğer sadece bir bilgisayar veya daha kapsamlı bir çerçeve uygulamakta girecek tüm iş olmadan birkaç farklı olanları tüm çekirdeklere ölçekli istiyorsanız bu sizin için daha ileri bakmak istiyorsunuz ama daha gerçekten büyük ölçekli paralel yapılmasını gerekiyorsa .

Cevap 06/02/2014 saat 14:19
kaynak kullanıcı

oy
3

Not: Söz yerde threaddemek, özellikle python ipler açıkça belirtildiği kadar.

Eğer geliyorsanız konu python biraz farklı işler C/C++arka. Python'da, yalnızca bir iş parçacığı verilen bir olark en durumunu çalışan olabilir bu mümkün değil tasarımla ipler çoklu çekirdek üzerinde paralel çalıştırmak için python Konuları gerçekten bu yana çoklu işlem çekirdeklerinin gücünü kaldıraç anlamına gelir.

Python bellek yönetim evreli olmadığı için her iplik piton interpreter.This veri yapılarına özel erişim özel erişim adı verilen bir mekanizma ile kazanılır gerektirir (küresel interpretr kilidi) .GIL

Why does python use GIL?

Aynı anda tercüman durumunu erişme ve tercüman devlet bozulmasını birden fazla konuları önlemek için.

Fikir iplik yürütülmektedir her bir (ana iş parçacığı olsa bile) , bir GIL kazanılır ve zaman bazı önceden tanımlanmış aradan sonra GIL başka iş parçacığı (varsa) geçerli iş parçacığı tarafından serbest ve reacquired.

Why not simply remove GIL?

O değil ki onun GIL kaldırmak imkansız onun bunu yaparken prcoess biz bile tek dişli yeterli performansı yapar erişimi seri hale getirmek amacıyla tercüman içine mutiple kilitleri koyarak sonunda sadece o.

böylece GIL kaldırma maliyeti arzu asla tek bir dişli uygulaması, daha düşük bir performans tarafından beslenen.

So when does thread switching occurs in python?

GIL Çıkış edildiğinde GIL released.So olduğunda Konu anahtarı oluşur? dikkate almak iki senaryo vardır.

Bir Konu işlemci Bağlı işlemleri (Örn görüntü işleme) yapıyorsa.

Piton hiçbir sabit sonra piton Eski sürümlerinde, Konu anahtarlama oluştuğu kullanılan instructions.It ayarlı varsayılan olarak oldu 100Ashton kapısı onun değil çok iyi bir politika süresi, tek komutun harcanan beri gerçekleşmesi gereken geçiş yaparken karar çıktı can çok çılgınca milisaniye ila hatta her sonrasında GIL salan bir second.Therefore 100olursa olsun çalıştırmak için almak zamanın talimatlar fakir politikasıdır.

Yerine iplik geçmek için bir metrik olarak talimat sayımını kullanarak yeni sürümlerinde, yapılandırılabilir bir zaman aralığı kullanılır. Varsayılan anahtarı aralık milliseconds.you kullanarak mevcut anahtar aralığını alabilirsiniz 5'tir sys.getswitchinterval(). Bu kullanılarak değiştirilebilirsys.setswitchinterval()

Bir Konu bazı IO Bağlı Operasyonu yapıyor ise (Örn dosya sistemi erişimi veya
ağ IO)

İplik tamamlandı almak IO operasyon için bazı bekliyor her GiL sürümüdür.

Which thread to switch to next?

kendi scheduler.which parçacığı yok tercüman aralığının sonunda planlanan hale işletim sisteminin bir karar. .

Cevap 30/03/2018 saat 10:47
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more