我是Python,Raspberry Pi和MySQL的新手,希望你能帮助我。我正在尝试用Python编写一个脚本,它可以每秒向MySQL表中插入数据。我可以插入数据,但不是像我想要的那样是定期的,我已经试了很多次,但我找不到解决问题的方法。下面是我的Python代码和插入到MySQL表中的数据:
#!/usr/bin/env python
import MySQLdb
import time
while True:
db = MySQLdb.connect("localhost", "mauro", "12345", "temps")
curs=db.cursor()
try:
curs.execute ("""INSERT INTO thetemps
values(0, CURRENT_DATE(), NOW(), 28)""")
db.commit()
print "Data committed"
except:
print "Error"
db.rollback()
db.close()
time.sleep(1)
正如您所看到的,有时纸条会周期性地插入数据,有时数据之间有8秒的间隔。所以,我的问题是:每次数据之间的间隔可能是1秒吗?我做错什么了? 对不起,英语不好,先谢谢你!在
不要为此使用事务,可能在尝试插入新行时某些表被锁定。在
理论上是的,但在实践中,有太多超出你控制范围的因素更有可能成为阻碍。其中包括但不限于:
这意味着,即使您的系统大部分时间处于空闲状态,
time.sleep(1)
也不能保证始终睡眠1秒,即使这样,系统也可能在做其他事情(例如,更多的I/O),并且每次执行相同操作需要不同的时间量。在另外,不要每次在循环内都创建一个新的连接,您应该保持连接打开并节省开销。在
我不认为你在这里做了什么特别的错事。代码看起来不错,除了每次创建新连接的额外开销之外,不应该。除此之外,这里的问题归结为你无法控制的因素。在
也就是说,你可以做一些事情来提高你的机会。在
一些改进性能的附加建议
存储引擎
除了避免在每次迭代时打开/关闭数据库连接的开销外,还应该检查用于表的存储引擎。例如,根据您的MySQL版本,默认值可能仍然是
MyISAM
,这需要table锁才能写入。在相比之下,
InnoDB
在写入表时只需要行锁定,如果其他人正在使用该表,这应该会有所改善。如果发现没有使用InnoDB
,请发出alter table ...
查询来更改存储引擎。在自动提交而不是事务
事务意味着将两个或多个查询的集合组合为一个单元,但您提交的是单个查询。相反,您应该将MySQL配置为启用自动提交,这样它就不必在提交和执行查询之后等待显式的
commit
请求,从而节省服务器和客户机之间的一些通信开销。在通过增加优先级来影响操作系统调度程序
您可以为您的程序设置更高的优先级,以便调度程序在这里更有用。它也可能有助于对数据库服务/进程执行相同的操作。在
其他用户级别的任务也可以在必要时降低优先级。在
您将在每次迭代中建立到数据库服务器的新连接。这可能需要任意时间。将
.connect()
等移到循环之外可能会使计时更加一致:相关问题 更多 >
编程相关推荐