2016-04-14 29 views
1

Paralel işlemede denen bir işlev var, myfunc. Birden fazla işlem aynı hedef klasörü paylaştığımda, hepsi paralel olarak myfunc'u arar ve hedef klasörün varlığını kontrol eder. Zaten var olsaydı sorun yok. Ancak, komut dosyasının başlatılmasından önce klasör mevcut değilse, ilk işlem, if bloğuna girer ve klasörü oluşturur. Öte yandan, hemen hemen aynı anda "hemen hemen" aynı anda girecek, klasörün bulunamayacağı ve bunu oluşturmaya çalışacak bir başka süreç de olacaktır. zaten yaptı. Yani bir noktada, zaten var olan klasöre söylüyorum bir OSError olacaktır.doğru işlem yaparken dosya varlığını doğru şekilde kontrol ediliyor

Çok işlem yaparken bu sorunla başa çıkmak için temiz bir yol var mı? Süreçlerimi başlatmadan önce hedef klasörün işlevini myfunc dışında tutmayı düşünüyorum. Ancak bilgi işlem için çok işlemciyi kullanarak bir çözüm bulmak güzel olurdu. eşzamanlılık sorunlarını çözmek için threading modülünden

import os, sys 

def myfunc(file_names, destination=None, file_permission=None, verbose=False): 
    absPath = os.path.abspath(file_names[0]) 
    baseName = os.path.basename(absPath) 
    dirName = os.path.dirname(absPath) 


    destination_folder = "/default/destination" if destination is None \ 
     else os.path.abspath(destination) 

    if not os.path.isdir(destination_folder): 
     os.mkdir(destination_folder) 
     os.chmod(destination_folder, file_permission) 
     if verbose: 
      print "Created directory", destination_folder 
+0

Peki, istisnayı yakalayın? – BlackBear

cevap

0

Kullanım Lock: bir dosya/klasör varlığını kontrol etme

import os, sys 
from threading import Lock 

def myfunc(lock, ...): 
    ... do stuff as usual ... 

    with lock: 
     destination_folder = "/default/destination" if destination is None \ 
      else os.path.abspath(destination) 

    ... do everything else as usual ... 

if __name__ == "__main__": 
    my_lock = Lock() 
    myfunc(my_lock, ...) 
+1

Ve eğer "çoklu işlem" (başlığa göre) kullanırsanız, o zaman eşdeğerli "çok işlemcili" Kilit. –

1

ve sonucuna dayanarak eyleme, çoğu durumda temelde yanlış olsa bile, çünkü Çok işlem görmüyorsun, bilgisayarda başka ne koştuğunu bilmiyorsun. Asla niyet etmemiş olsanız bile, bir başkasının daha sonra işleminizin birden çok kopyasını çalıştırmayacağını garanti etmek de zordur.

En sağlam yöntem, her zaman klasörü oluşturmayı denemek ve "zaten var olan" hatasını sessizce yok saymaktır. ("Ama bu izne sahip değilsiniz" gibi diğer hataları göz ardı etmeyin!) Çok işlemciyi başlatmadan önce tek bir kontrol yapmış olsanız bile bu, işleri yapmanın en iyi yolu olacaktır.

+0

Yakalama özel durum ve kilit kombinasyonunun kullanılması gerektiğini düşünüyor musunuz? Aslında sizin ve th3an0maly'nin arasındaki en uygun cevabın hangisi olduğunu bilmiyorum. – kaligne

+0

Sağlam olmak için, istisnayı yakalamalısınız. Genel durumda, kilitleriniz mükemmel olsa bile, başka bir program beklenmedik biçimde dosyaları veya klasörleri sizin altınızdan değiştirebilir. Bunu yaptıktan sonra, kilitleri veya koşullarını kullanmanın da değer ekleyip eklemediğini değerlendirebilirsiniz. Kesinlikle yararlı olacak yerler var, ama bu yerlerden biri olduğunu düşünmüyorum. İstisnaı yakaladığınızda, kilit herhangi bir ek güvenlik sağlamadan bu çözüme ekstra karmaşıklık katar. – GrandOpener

İlgili konular