2010-06-26 79 views
1

我正在尋找一種方法來簡化我的線程代碼。簡化python中的線程

有很多在我的代碼,我做類似的地方:

for arg in array: 
    t=Thread(lambda:myFunction(arg)) 
    t.start() 

即運行相同的功能,每次不同的參數,在線程。

這當然是實際代碼的簡化版本,並且通常for循環內的代碼長度爲10-20行,在上例中使用一個輔助函數如myFunction不能使其變得簡單如果是這樣,我可以只使用一個線程池)。

另外,這種情況在我的代碼中非常非常常見,所以有很多行我認爲是多餘的。這將幫助我很多,如果我沒有需要處理所有這些樣板代碼,而是能夠做這樣的事情:

for arg in array: 
     with threaded(): 
      myFunction(arg) 

即莫名其妙需要裏面的每一行代碼並運行它在一個單獨的線程。

我知道上下文管理者不應該被用在這種情況下,這可能是一個壞主意,需要一個醜陋的黑客,但是 - 是否可以完成,以及如何?

+0

我不知道爲什麼你需要這個。你知道Python線程實際上並不在多個核心/ CPU上並行運行,對嗎? – 2010-06-26 12:36:34

+0

@Eli:他的代碼不可能是IO綁定的,可以嗎? :) – 2010-06-26 12:40:35

+0

@Mark:其實,這就是我問的原因。他的使用案例似乎不是IO限制。這可能是,因此我想知道它是什麼 - 總是樂於學習,你知道:-) – 2010-06-26 12:41:52

回答

0

線程池會在這裏幫助你嗎? Python存在許多實現,例如this one


P.S:仍想知道您的具體使用情況是什麼

+0

在他的問題中,我沒有看到任何指示GIL的Python實現。 – 2010-06-26 13:06:24

0

你想要的是一種「情境線程池」的。

看看this module中的ThreadPool類,它的設計目的與您給出的方式類似。使用將會是這樣的:

with ThreadPool() as pool: 
    for arg in array: 
     pool.add_thread(target=myFunction, args=[arg]) 

任何給予ThreadPool的任務失敗都會標記一個錯誤,並執行標準錯誤回溯處理。

+0

當然要注意,你可以根據自己的語法來調整它,但我非常喜歡標準的'threading.Thread'接口,並對其進行了修改。 – 2010-06-26 12:51:58

+0

謝謝,但它仍然需要我明確地定義'myFunction',這是我正在試圖避免的那種混亂......這是我的錯,應該在我的問題中更強調它。我會編輯它。 – olamundo 2010-06-26 12:58:18

0

我覺得你太過複雜了。這是「模式」我用:

# util.py 
def start_thread(func, *args): 
    thread = threading.Thread(target=func, args=args) 
    thread.setDaemon(True) 
    thread.start() 
    return thread 

# in another module 
import util 
... 
for arg in array: 
    util.start_thread(myFunction, arg) 

我沒有看到關於有創建myFunction大不了的。你甚至可以用啓動它的函數來定義函數。

def do_stuff(): 
    def thread_main(arg): 
     print "I'm a new thread with arg=%s" % arg 
    for arg in array: 
     util.start_thread(thread_main, arg) 

如果你正在創建大量的線程,線程池肯定更有意義。您可以使用Queuethreading模塊輕鬆製作自己的模塊。基本上創建一個jobs隊列,創建N工作線程,給每個線程一個指向隊列的「指針」,讓他們從隊列中取出工作並處理它們。

1

如何:

for arg in array: 
    def _thread(): 
     # code here 
     print arg 

    t = Thread(_thread) 
    t.start() 

另外,與裝飾,就可以吃糖就起來一點:

def spawn_thread(func): 
    t = Thread(func) 
    t.start() 
    return t 

for arg in array: 
    @spawn_thread 
    def _thread(): 
     # code here 
     print arg 
+0

p這幾乎讓我相信了,但問題在於你的參數的範圍。如果您在範圍我做 (10): @spawn_thread DEF F(): 睡眠(1) 打印我 你'9 9 9 9 9 9 9 9 9 9 9'作爲輸出 – olamundo 2010-06-26 21:05:26