Python:线程无法启动

时间:2012-12-23 22:19:12

标签: python multithreading

我有一个继承自threading.Thread的班级。由于某种原因,线程不想启动。

这是我的代码:

import time,threading,re,socket


class PyWatch(threading.Thread):

    filename = ""


    def __init__(self,filename):
        threading.Thread.__init__(self)
        print "initiating..."
        self.filename = filename


     def run(self):
        print "running..."
        thefile = open (self.filename)
        thefile.seek(0,2)      # Go to the end of the file
        while True:
                line = thefile.readline()
                if not line:
                     time.sleep(0.1)    # Sleep briefly
                     continue
                yield line
                self.process(line)


    def process(self,line):
        ip =  self.filterIPFromLine(line)
        print ip                

    def filterIPFromLine(self,line):
        ip = None
        if '/var/ossec/active-response/bin/firewall-drop.sh' in  str( line ).lower():
            ip = re.match( "(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])" )

            try:
                socket.inet_aton(ip[0])
                ip = ip[0]
            except socket.error:
                pass
        return ip


tom = PyWatch('example.log')
tom.start()

代码正在运行,它不返回任何错误,但由于某种原因,它永远不会到达run()部分。

2 个答案:

答案 0 :(得分:4)

您需要删除该行:

            yield line

这导致run()没有,嗯......跑!它首先出现在那里并不明显。

根据Python Documentationthe yield expression仅在定义生成器函数时使用,在调用生成器函数时,它返回称为生成器的迭代器。然后该生成器控制生成器函数的执行。 当调用其中一个生成器的方法时,执行开始。

由于您没有调用任何生成器方法(例如next()),因此该函数不会执行。

以下是一个快速演示:

Python 2.7.2 (default, Jun 20 2012, 16:23:33) 
[GCC 4.2.1 Compatible Apple Clang 4.0 (tags/Apple/clang-418.0.60)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> def fun():
...     print 'Starting'
...     for i in range(10):
...             yield i
... 
>>> fun()
<generator object fun at 0x10678c460>
>>> _.next()
Starting
0
>>> 

an excellent explanation of the yield expression作为What does the "yield" keyword do in Python?的答案。

答案 1 :(得分:2)

我无法重现这个问题:

当我运行你的代码时,我得到:

initiating...
running...

这表明run()方法确实正确执行。

您是否在代码顶部正确导入了线程模块?

import threading