为什么两个线程实现的行为不同?

时间:2013-12-19 14:00:21

标签: python multithreading

为什么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”打印而不等待睡眠()时间。

我的问题是为什么第一个代码执行被阻止而第二个代码执行未阻塞?

1 个答案:

答案 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的呼叫完成之前。