ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

python – 在守护进程中失去与postgresql的连接

2019-06-13 01:38:29  阅读:205  来源: 互联网

标签:python linux postgresql psycopg2 daemon


我正在重写一个python脚本来存储postgresql数据库中的arduino数据,希望使用python-daemon将其作为deamon运行.原始脚本工作正常,但在deamon中,我无法写入数据库.第一次尝试最终结果是:

<class 'psycopg2.DatabaseError'>, DatabaseError('SSL SYSCALL error: EOF detected\n'

然后:

<class 'psycopg2.InterfaceError'>, InterfaceError('cursor already closed',)

在工作脚本中,我做:

connstring="dbname='"+dbdatabase+"' user='"+dbusername+"' host='"+dbhost+"'password='"+dbpassword+"'"
try:
  conn = psycopg2.connect(connstring)
  cur=conn.cursor()
except:
  my_logger.critical(appname+": Unable to connect to the database")
  sys.exit(2)
sql="insert into measure (sensorid,typeid,value) VALUES(%s,%s,%s)"
< more to set up serialport, logging and so on>
while 1:
  < fetch a data set and split it to a list >
  for (i,val) in enumerate measures:
     try:
       cur.execute(sql,(sensors[i],typeid[i],val)) 
       conn.commit()
     except:
       self.logger.error(appname+": error 106 :"+str(sys.exc_info()))

我有一种感觉,这可能是我最初使用串行连接Serial port does not work in rewritten Python code的一些问题,所以我试图摆弄files_preserve,做:

self.files_preserve=range(daemon.daemon.get_maximum_file_descriptors()+1)

据我所知,应该保持打开所有文件句柄,但无济于事.

在守护进程中,我首先尝试将数据库连接设置为__init__中的属性,i. Ë:

self.conn = psycopg2.connect(connstring)
self.cur=conn.cursor()

然后在run方法中执行插入操作.我还尝试在run方法的顶部创建连接,甚至将其设置为全局对象,但在所有情况下,似乎都在扼杀数据库连接.有线索吗? (或者在哪里找到守护程序模块的某些文档(源代码除外)的线索?)

守护进程和数据库都在使用python 2.7和postgresql8.4`的debian linux系统上运行.

解决方法:

据我所知,daemon.runner在forking之前工作,然后执行你提供的守护进程应用程序的run方法.

这意味着您在一个进程中创建数据库连接,但随后尝试在分叉进程中使用它,psycopg2 doesn’t like

libpq connections shouldn’t be used by a forked processes, so […] make sure to create the connections after the fork.

在这种情况下,这意味着:将您对psycopg2.connect的调用移动到run方法中.

标签:python,linux,postgresql,psycopg2,daemon
来源: https://codeday.me/bug/20190613/1229339.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有