2014-02-19 20 views
3

我想了解與低於2的代碼片段會發生什麼 -deferToThread VS遞延()

代碼片段#1

from twisted.internet import threads, defer, reactor 

def proc1(a): 
    while True: 
     print "Proc----------1" 

def proc2(a): 
    while True: 
     print "Proc----------2" 

def proc3(a): 
    while True: 
     print "Proc----------3" 

d1 = threads.deferToThread(proc1) 
d2 = threads.deferToThread(proc2) 
d3 = threads.deferToThread(proc3) 

reactor.run() 

我的理解是所有的線程平行運行,並輸出=>所有的特效的標準輸出混合

剪斷#2

from twisted.internet import threads, defer, reactor 

def proc1(a): 
    while True: 
     print "Proc----------1" 

def proc2(a): 
    while True: 
     print "Proc----------2" 

def proc3(a): 
    while True: 
     print "Proc----------3" 



d1 = defer.Deferred() 
d2 = defer.Deferred() 
d3 = defer.Deferred() 

d1.addCallback(proc1) 
d2.addCallback(proc2) 
d3.addCallback(proc3) 

d1.callback('a') 
d2.callback('a') 
d3.callback('a') 

reactor.run() 

對於這個片段 - 每個延遲迴調一個接一個地觸發,並且就輸出而言,只有proc1 stdouts會無限期地傾倒。

如果我錯了,請糾正我的錯誤。所以基本上我想要理解和確認的是延遲對象被一個接一個地觸發,而deferToThread按名稱線程並行運行。

回答

4

請糾正我,如果我錯了人。所以基本上我想要理解和確認的是延遲對象被一個接一個地觸發,而deferToThread按名稱線程並行運行。

這並不完全正確,但它有點接近。下面是觸發您Deferreds代碼:

d1.callback('a') 
d2.callback('a') 
d3.callback('a') 

你觸發它們一前一後。沒有什麼特別的或神祕的。這正是Python的工作原理。

延遲與線程無關。它們不會自動使代碼無阻塞或異步或多線程。他們只是保留一個功能列表(您使用addCallback方法添加到該列表中),然後調用該列表中的功能(當您使用callback方法時)。

+0

deferToThread使這些特效運行平行是什麼呢? @jean – deeshank

+0

我關心的是deferToThread函數是否允許你並行運行多個線程? – deeshank

+1

'deferToThread'使用stdlib'threading'模塊。線程的行爲與在Python中始終表現的線程完全相同。 –

1

你的理解是確定的。

代碼段1將同時運行所有的程序(每個程序都在它自己的線程中)。這三個程序必須是線程安全的。

代碼段2將在反應器線程中一個接一個地運行程序。只有當一個過程完成時,反應器線程纔會傳遞給下一個延遲,因此開始執行下一個過程。

如果其中一個延遲是扭曲的一部分,例如通過網絡訪問某些內容,當它阻止反應堆時,它將繼續移動到下一個未阻止的延遲,並最終在取消阻止後取回被阻止的延遲。

你不必擔心你的流程相互干擾的約一(即只要你沒有其他代碼調用它們或多個反應器中調用它們)