为什么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()
在第一个代码执行中,print stmt。和get_call()在5秒后执行,这意味着代码的下一行执行被阻止。而在第二个代码中,print stmt。打印“HHHHHHHHHHHHHHHHHHHHHHHHHHHH”打印而不等待睡眠()时间。
我的问题是为什么第一个代码执行被阻止而第二个代码执行未阻塞?
答案 0 :(得分: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
的呼叫完成之前。