2013-01-10 18 views
1

我現在有一個全球性的鎖定= threading.Lock(),並進行下面的調用。在serialRemove,我有Python的並行執行threading.Lock無法正常運轉的好意

Lock.acquire() 
print(f+' if') 
if h in hashes: 
    try: 
     os.remove(path) 
     if l: print('Removing ' + path) 
     removed += 1 
    except os.error: 
     print('Encountered error removing file') 
else: 
    hashes.add(h) 
    print(f+' else') 
Lock.release() 

(注意,在哈希值h是總是假在我的情況),在通話效果的 部分: 10.txt如果
11.txt如果

20.txt如果
我不明白如果我圍繞代碼鎖定可能有兩個f +'if'打印。有沒有保護的代碼塊,最好沒有簡單的方法獲得:
10.txt如果
10.txt其他
11.txt如果
11.txt其他
20.txt如果
20.txt否則

+0

作爲一個方面說明,你真的不應該叫你的鎖'鎖'。它使事情變得混亂,因爲這也是類型的名稱(儘管類型名稱在此處是合格的)。 (如果您按照變量和函數的小寫名稱的PEP 8風格,除內置類型之外,它甚至不會出現。) – abarnert

+0

您使用的是'Parallel'的庫。它看起來不像['multiprocessing'](http://docs.python.org/3/library/multiprocessing.html)或['concurrent'](http://docs.python.org/3/library /concurrent.futures.html#module-concurrent.futures)從stdlib或[Parallel Python](http://www.parallelpython.com)。我可以考慮一些不太常用的庫,它們有一個名爲'Parallel'的類,它也可能有一個名爲'delayed'的函數,但是沒有辦法猜出你的意思。 – abarnert

回答

2

threading.Lock只適用於同一進程的線程之間。

實際上,在沒有真正知道您在使用何種並行機制的情況下,很難確定,但它幾乎可以肯定地執行單獨進程中的任務。 (任何在同一進程中啓動線程,至少在CPython中,由於GIL,將不會獲得CPU限制代碼的任何有效並行性,因此,他們都不會這樣做。)

因此,如果您嘗試使用來自其他進程的全局對象threading.Lock,則您將在每個進程中獲得完全獨立的鎖定。所以,鎖定它並沒有什麼好處。 (使用一些並行庫 - 每個平臺上可能都不相同 - 你會得到一個錯誤,但是它不可能做到你想要的。)

大多數並行庫都有自己的鎖類型,它們的樣式多處理。如果屬於您的話,請使用圖書館附帶的那個。

如果不是,取決於你的圖書館的工作方式,multiprocessing.Lock可能會伎倆。

如果不是,您將不得不明確地使用鎖文件(可能與flock/lockf一起使用,或依賴Windows獨佔打開或其他)來實現某些內容。

此外,請注意,至少有一個API庫可以理解您的示例代碼行[joblib],它明確設計用於沒有任何共享的任務,因此isn'我應該用鎖來工作。 (它可能會與multiprocessing.Lock無論如何,但你真的不應該指望這一點。)

+0

感謝您的洞察,謝謝! – TheoretiCAL