Python

2010-07-22 11 views
41

'da mutekslerin doğru kullanımı Python'da çoklu iş parçacıkları ile başlayacağım (veya en azından komut dosyamın birden fazla iş parçacığı oluşturması mümkündür). Bu algoritma bir Muteksin doğru kullanımı mı olur? Bu kodu henüz test etmedim ve muhtemelen işe yaramayacak. Kuyrukta bir iş parçacığı olsa bile, processData'nin bir iş parçacığı (bir kerede) ve ana while döngüsünde çalışmaya devam etmesini istiyorum.Python

Düzenleme: kodumu yeniden okuduğumun yanlış olduğunu anlıyorum. ama hey, bu yüzden burada yardım istiyorum.

+0

Size çalıştığınız anlamaya çok zordur yap. Amacınızı daha ayrıntılı bir şekilde açıklamanız gerekecek. –

+0

@Marcelo Cantos, muhtemelen haklısınız. Kodumun processData'da yeni bir baslamayla başlamasını istiyorum. Sadece bir iş parçacığının verileri bir seferde işleyebilmesini ve veriyi işlem verilerinin gönderildiği sıraya göre sıralamak istiyorum. Ayrıca, diğer iş parçacıkları sıradayken ana döngüde döngü tutmak istiyorum. – Richard

+0

@Richard: Niçin tüm işlemleri seri hale getirmeyi planlıyorsanız iplikleri kullanmak istersiniz? Basit bir döngüde neyin var? Ayrıca, ana iş parçacığının neden sürekli devam etmesini istiyorsunuz? Sadece diğer konuları açarak, CPU yakar. –

cevap

96

. Bu ise gayet - çünkü CPython mimarisi (yani Global Interpreter Lock) etkili tek iplik zaten anda çalışan gerekecek arasında,

from threading import Thread, Lock 

mutex = Lock() 

def processData(data): 
    mutex.acquire() 
    try: 
     print('Do some stuff') 
    finally: 
     mutex.release() 

while True: 
    t = Thread(target = processData, args = (some_data,)) 
    t.start() 

Ama dikkat edin: Python yöntemlerinin kullanılması, bu oldukça basittir I/O bağlı ipliği mümkün olduğu kadar serbest bırakmak isteyebilirsiniz, ancak I/O bağlı iş parçacığı, diğer iş parçacıklarının çalışmasını engeller.

Python 2.6 ve sonrası için bir alternatif, Python'un multiprocessing paketini kullanmaktır. threading paketini yansıtır, ancak 'un aynı anda çalışabileceği tamamen yeni işlemler oluşturur.

from multiprocessing import Process, Lock 

mutex = Lock() 

def processData(data): 
    with mutex: 
     print('Do some stuff') 

if __name__ == '__main__': 
    while True: 
     p = Process(target = processData, args = (some_data,)) 
     p.start() 
+0

Kodunuzu denedim ve şu hatayı alıyorum: mutex: SyntaxError: geçersiz sözdizimi. Denemeyi kullanabileceğimi tahmin ediyorum: hariç: işlevimde python 2.4 kullanıyorum – Richard

+4

'with' Python 2.5 ve 'multiprocessing 'Python 2.6. Buna göre düzenlenmiştir. –

+0

Tüm yardımlarınız için teşekkür ederim, eğer bir kez daha size katılabilirdim. Ben tüm yorumlarımda yorumda bulundum: D yardımcı oldular – Richard

7

Bir ara adresinden Mutex kilidini var ... sen Pencere Mutex yerine Python'un kullandığınız neden bilmiyorum

12

Bu benim ile geldi çözümdür: Bu güncellemek için örnek Önemsiz

import time 
from threading import Thread 
from threading import Lock 

def myfunc(i, mutex): 
    mutex.acquire(1) 
    time.sleep(1) 
    print "Thread: %d" %i 
    mutex.release() 


mutex = Lock() 
for i in range(0,10): 
    t = Thread(target=myfunc, args=(i,mutex)) 
    t.start() 
    print "main loop %d" %i 

Çıktı:

main loop 0 
main loop 1 
main loop 2 
main loop 3 
main loop 4 
main loop 5 
main loop 6 
main loop 7 
main loop 8 
main loop 9 
Thread: 0 
Thread: 1 
Thread: 2 
Thread: 3 
Thread: 4 
Thread: 5 
Thread: 6 
Thread: 7 
Thread: 8 
Thread: 9 
+5

Potansiyel bir kilitlenme var. Baskı ifadesi bir Özel Durum atarsa, muteks'i asla bırakmazsınız. Kilidin serbest kalmasını sağlamak için 'try/release' veya' with' kullanmanız gerekir. Cevabımı gör. –

+2

Ayrıca, muteks işlevine bir argüman olarak geçmeye gerek yoktur. Global kapsamda mevcut. –