我正在开发一个客户端 - 服务器python程序,目前我正在运行它,有两个客户端向服务器发送数据。当我运行它时,我启动一个客户端,然后几秒钟后启动另一个客户端。
问题是当我在客户端完成后查看数据库时,我只看到为第二个客户端(最后一个启动的那个)写入的条目,即使程序输出(stdout)显示它已经过去了为来自两个客户端的数据写入csv的代码部分。两个客户端以10秒的间隔发送信息。下面是服务器接收消息的代码。在strs [0] ==' \' cpu':
的情况下,它会写入相关的csv文件def serverLoop(conn):
with open(database, 'wb') as csvfile:
fieldnames = ['cpu', 'pid', 'memory']
writer = csv.DictWriter(csvfile, fieldnames=fieldnames,
quotechar='|', quoting=csv.QUOTE_MINIMAL)
writer.writeheader()
while 1:
data = conn.recv(1024)
#print 'data is', repr(data)
#if repr(data) == COMPLETE: break
conn.send(data)
strs = repr(data).split()
if strs[0] == '\'Thread':
t = strs[9]
process = strs[4]
logging.info('Heartbeat from thread with pid %s running at %s seconds' % (process, t))
if strs[0] == '\'cpu':
cpuData = strs[1] + ', ' + strs[2]
print 'cpu data received'
writer.writerow({'cpu': cpuData})
print cpuData
print 'wrote to db'
我在ubuntu上使用python 2.7。
答案 0 :(得分:0)
csv文件不是数据库。如果您同时从两个不同的程序写入文件,则只有最后一次保存才会赢得' (覆盖另一个)。
答案 1 :(得分:0)
问题可能是您打开文件的方式。使用模式"wb"
将在每次打开文件时截断文件,丢弃之前的任何内容。如果您的每个客户端都连接到服务器一次,这可能就是您只看到第二个客户端的原因。
尝试使用模式"ab"
代替"wb"
。 "a"
代表"追加"模式,允许写入并自动搜索到文件的末尾。
这样做的一个缺点是,如果你使用当前的代码,你会得到重复的标题,因为你每次设置DictReader
时都要写它们。您可能希望进行一些额外的检查,以查看该文件是否已有某些内容,如果没有,则只写入标题。一种简单的方法是拨打csvfile.tell()
,报告您在文件中的位置。由于追加模式寻找到文件的末尾,因此只有当文件为空(或者之前没有)时它才会为零。