2017-07-16 257 views
1
當我試圖讓我的劇本多線程

多線程處理?

我發現了多,

我不知道是否有一種方法,使與線程多處理工作?

  • CPU 1 - > 3個線程(工人A,B,C)
  • CPU 2 - > 3個線程(工人d,E,F)
  • ...

林試圖自己做,但我遇到了很多問題。

有沒有辦法使這兩個工作在一起?

回答

2

您可以生成許多Processes,然後產卵Threads從他們裏面。每個進程幾乎可以處理標準解釋器線程可以處理的任何事情,所以沒有什麼能阻止您在每個進程中創建新的線程或甚至是新的進程。作爲一個最小的例子:

def foo(): 
    print("Thread Executing!") 

def bar(): 
    threads = [] 
    for _ in range(3): # each Process creates a number of new Threads 
     thread = threading.Thread(target=foo) 
     threads.append(thread) 
    for thread in threads: 
     thread.start() 
     thread.join() 

if __name__ == "__main__": 
    processes = [] 
    for _ in range(3): 
     p = multiprocessing.Process(target=bar) # create a new Process 
     processes.append(p) 
    for process in processes: 
     process.start() 
     process.join() 

線程之間的通信可以在每個Process內處理,並且進程之間的通信可以在使用隊列或Manager對象根解釋水平進行處理。

+0

此代碼真的幫了我很多, 如果我將Queue添加到此代碼中,我應該鎖定處理還是線程? 我假設如果我鎖定了進程,我會停止3個線程嗎? –

+0

@ atth3burger91這取決於你想要做什麼。根據[文檔](https://docs.python.org/2/library/multiprocessing.html#exchanging-objects-between-processes),「隊列是線程和進程安全的」,所以您不必擔心同時添加到隊列中。但是,如果您關心的是以特定順序添加和檢索,則應該添加鎖,或者將標識符添加到傳遞給隊列的對象。經理字典也可以更容易使用,雖然他們輕量級。 – JAustin

+0

請注意,我的原始示例是sl,的,因爲打印不是線程安全的。每個打印語句都應該有一個'lock.acquire'和'lock.release'語句來防止同時寫入輸出流。 – JAustin

1

可以定義一個function,需要一個process,並使其運行3 threads然後產卵的過程瞄準這一function,例如:

def threader(process): 
    for _ in range(3): 
     threading.Thread(target=yourfunc).start() 

def main(): 
    # spawn whatever processes here to target threader