Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 实时读取多个文件?_Python_Multithreading_File Io - Fatal编程技术网

Python 实时读取多个文件?

Python 实时读取多个文件?,python,multithreading,file-io,Python,Multithreading,File Io,我试图监听不断更新的日志文件,并不断处理这些行。 问题是我有多个文件要听。日志由jboss实例分开,我必须将它们一起工作,才能将它们插入数据库中 我有一个很好的例子说明了如何从问题中连续读取一个文件,但是这段代码一次只读取一个文件。我尝试了下面的代码来读取它们,但它只侦听它在文件数组中找到的第一个文件 我怎样才能多线程处理这个文件来同时处理所有的文件呢 import time from glob import glob def follow(thefile): thefile.seek

我试图监听不断更新的日志文件,并不断处理这些行。 问题是我有多个文件要听。日志由jboss实例分开,我必须将它们一起工作,才能将它们插入数据库中

我有一个很好的例子说明了如何从问题中连续读取一个文件,但是这段代码一次只读取一个文件。我尝试了下面的代码来读取它们,但它只侦听它在文件数组中找到的第一个文件

我怎样才能多线程处理这个文件来同时处理所有的文件呢

import time
from glob import glob

def follow(thefile):
    thefile.seek(0,2)
    while True:
        line = thefile.readline()
        if not line:
            time.sleep(0.1)
            continue
        yield line



if __name__ == '__main__':
    for log in glob("/logs/xxx/production/jboss/yyy*/xxx-production-zzzz*/xxx-production-zzzz*-xxx-Metrics.log"):
        logfile = open(log, "r")
        loglines = follow(logfile)

        for line in loglines:
            print line,

您可以使用以下代码同时打印每个文件的行:

lock = threading.Lock()

def printFile(logfile):
    loglines = follow(logfile)
    for line in loglines:
        #only one thread at a time can print to the user
        lock.acquire()
        print line
        lock.release()



if __name__ == '__main__':
    for log in glob("/logs/xxx/production/jboss/yyy*/xxx-production-zzzz*/xxx-production-zzzz*-xxx-Metrics.log"):
        logfile = open(log, "r")
        t = threading.Thread(target = printFile,args = (logfile,))
        t.start()

也许您想要的是为每个文件创建一个线程,并将您定义的follow函数设置为目标函数。@Rawing我曾尝试将其应用于我的情况,但我不能很好地理解它。但是谢谢。@theVoid上面的回答差不多就是这个,对我来说很有效。谢谢你的帮助!