新手区 请教一个 python 中,关于线程问题

Daa盛 · 2016年07月19日 · 最后由 玄谊 回复于 2016年07月19日 · 1915 次阅读

我在自学 python 多线程的时候,遇到一个很莫名其妙的问题。大家请看代码


from threading import Thread
import time


class MyThread(Thread):

    def run(self):
        print ' I am a thread.'


def bar():
    for i in xrange(5):
        time.sleep(1)
        print i


t1 = MyThread(target=bar)
t1.start()

结果:

I am a thread.

我凑,bar 没有执行。。。。
我也知道问题在哪,是因为 MyThread 里面的 run,子类没法调用 Thread 里面的 run。但是,我用了一个在 bar 后面,加了一个(),就能运行 bar(),哪位大神能解答一下。。。代买如下。


from threading import Thread
import time


class MyThread(Thread):

    def run(self):
        print ' I am a thread.'


def bar():
    for i in xrange(5):
        time.sleep(1)
        print i


t1 = MyThread(target=bar())  #主要区别就在加了一个().....
t1.start()

结果:

0
1
2
3
4
  I am a thread.

这个神奇的 ()....

共收到 5 条回复 时间 点赞

只传 bar 是传递的 bar 这个函数对象,你在接下来的代码中并没有对 bar 有后续操作,故而如你看到的 bar 函数没有输出。加上 () 后,你传递的是 bar 函数运行的结果,故而你看到 bar 执行了。

t1 = MyThread(target=bar()) 这种做法实际上是,先执行 bar 这个函数,将该函数的返回值作为参数,传递给 MyThread。

#1 楼 @wanxi3
那我可不可以理解为,加个括号,其实是错的?这么写不对?

4楼 已删除

#3 楼 @da_sheng 这个要看实际应用的场景了,有的直接传就可以,有的时候比如 bra 中有个参数还不确定,这个时候就不要 bar 函数执行,所以只传递函数对象,等那个参数确定后,这个时候在执行 bar。所以两个没有对错,只是实际应用的方式不同,针对的场景不同。

子类的 run 覆盖了父类的 run,但是子类 run 里边没有调用父类 run 的代码

def run(self):
    super(MyThread, self).run()
    print ' I am a thread.'

看看你是不是要这个效果

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册