2013-12-19 38 views
2

爲什麼Python中的兩個線程實現的行爲不同?爲什麼兩個線程實現的行爲不同?

我有兩個代碼:

1.

from threading import Thread 
import pdb 
import time 


def test_var_kwargs(**kwargs): 

    time.sleep(5) 
    print kwargs['name'] 
    for key in kwargs: 
    print "another keyword arg: %s: %s" % (key, kwargs[key]) 


def get_call(): 
    thr = Thread(target=test_var_kwargs(name='xyz', roll=12)) 
    thr.start() 
    print "!!!!!!!!!!!!!!!!!!" 


get_call() 
print "hohohoo" 
get_call() 

2.

import threading 
import time 

class Typewriter(threading.Thread): 

    def __init__(self, your_string): 
    threading.Thread.__init__(self) 
    self.my_string = your_string 

    def run(self): 
    for char in self.my_string: 
     print "in run" 
     time.sleep(5) 


typer = Typewriter("hehe") 
typer.start() 
print "HHHHHHHHHHHHHHHHHHHHHHHHHHH" 
# wait for it to finish if you want to 
typer.join() 

在第一代碼的執行時,打印語句。和get_call()在5秒後執行,這意味着代碼的下一行執行被阻止。而在第二個代碼中,打印標記。即打印「HHHHHHHHHHHHHHHHHHHHHHHHHHH」而不等待睡眠()時間。

我的問題是爲什麼第一個代碼執行被阻止而第二個代碼被解除阻塞?

回答

2

我花了一些時間來弄清楚這個問題了...

這條線:

thr = Thread(target=test_var_kwargs(name='xyz', roll=12)) 

不正確。嘗試:

thr = Thread(target=test_var_kwargs, kwargs={'name':'xyz', 'roll': 12}) 

第一個例子是阻塞話,5秒time.sleep因爲你打電話給你創建線程對象之前的目標函數。這調用返回None使線程的實際創建是這樣的:

thr = Thread(target=None) 

雖然這不是一個錯誤,將立即結束。但在撥打test_var_kwargs之前未完成。

+0

+1,真是它更多的語義錯誤,其中python不會將其標記爲錯誤。 thnx – nebi

+0

嘿Nebi,如果答案解決了這個問題,那是很好的stackoverflow禮節來標記它是正確的。它讓稍後閱讀此答案的人立即知道它是正確的。 – aychedee

相關問題