【发布时间】:2021-01-19 10:31:05
【问题描述】:
上下文
我正在使用 tcpdump 来监视数据包。我在 60 秒内循环遍历实时中的每一行并汇总数据。
然后,60 年代后,我更新数据库。即使没有数据包(通过插入空数据),我也需要每 60 秒不断地获取数据。
问题
如果没有互联网或数据包,循环不会继续,我必须等待 x 秒才能获得下一个输出。问题是间隔可以> 60s。
当前代码
ts = int(time.time())
p = subprocess.Popen(
(
"tcpdump",
"-neqli",
"eth0"
),
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
universal_newlines=True,
)
interval = 60
sessions = {}
for row in iter(p.stdout.readline, ""):
# Do some work, aggregate data
splited_row = row.split(" ")
log_ts = splited_row[0]
sessions[log_ts] = "Anything"
if int(time.time()) - interval > ts:
# Insert in database
insert_in_database(sessions)
ts = int(time.time())
解决方案
感谢@Gerd,我不得不使用线程和队列。
在生产者中,我使用上面的代码没有时间部分。首先,我获取当前队列数据以在每个新输入时更新它。然后我没有插入,而是将我的聚合数据放入其中。
然后,我的消费者每 60 秒循环一次,获取队列数据并插入。
【问题讨论】: