Python 每隔一段时间读一次标准输出 上下文

Python 每隔一段时间读一次标准输出 上下文,python,popen,tcpdump,Python,Popen,Tcpdump,我在用tcpdump看数据包。在60秒内,我在实时和聚合数据中循环每一行 然后,60秒后,我更新了数据库。我需要每隔60秒不断地获取数据,即使没有数据包(通过插入空数据) 问题 如果没有internet或数据包,循环就不会继续,我必须等待x秒,等待下一个输出。问题是间隔可能大于60秒 现行代码 ts=int(time.time()) p=子进程Popen( ( “tcpdump”, “-neqli”, “eth0” ), stdout=子流程.PIPE, stderr=子流程.PIPE, uni

我在用tcpdump看数据包。在60秒内,我在实时和聚合数据中循环每一行

然后,60秒后,我更新了数据库。我需要每隔60秒不断地获取数据,即使没有数据包(通过插入空数据)

问题 如果没有internet或数据包,循环就不会继续,我必须等待x秒,等待下一个输出。问题是间隔可能大于60秒

现行代码
ts=int(time.time())
p=子进程Popen(
(
“tcpdump”,
“-neqli”,
“eth0”
),
stdout=子流程.PIPE,
stderr=子流程.PIPE,
universal_newlines=True,
)
间隔=60
会话={}
对于iter中的行(p.stdout.readline,“”):
#做一些工作,聚合数据
拆分的行=行。拆分(“”)
日志\u ts=拆分的\u行[0]
会话[日志]=“任何内容”
如果int(time.time())-interval>ts:
#在数据库中插入
在_数据库中插入_(会话)
ts=int(time.time())
解决方案 感谢@Gerd,我不得不使用线程和队列

在producer中,我使用上面的代码,没有时间部分。首先,我获取当前队列数据,以便在每次新输入时更新它。然后,我将聚合数据放入其中,而不是插入


然后,我的消费者每60秒循环一次,获取队列数据并插入它。

我建议使用生产者-消费者方法,使用两个线程:(使用随机整数值而不是字符串)

在您的情况下,生产者线程将从子流程读取
tcpdump
输出并将结果放入队列中,使用者线程将每隔60秒查看一次队列,并找到一些数据或队列为空。因此,消费线程主循环的外观如下所示:

while True:
    if not q.empty():
        item = q.get()
        print('Getting ' + str(item) + ' : ' + str(q.qsize()) + ' items in queue')
        # insert data into database
    else:
        print('No data')
        # insert null data into database
    time.sleep(60.0)

这看起来是一个很好的解决方案,但我一次只能得到一个项目。其想法是在60年代存储所有内容,然后一次又一次地对其进行迭代。而且,我不能使用睡眠在消费者类中工作。当然,您可以在队列中存储多个项目,然后每60秒在消费者端检索所有项目(例如,对于范围内的I(q.qsize())或类似内容)。为什么使用
睡眠
会有问题?它应该只暂停消费者循环(在线程中运行)。糟糕的是,我在前一段时间有过一段时间。这很有效,非常感谢!