我试图每隔x秒(在我的情况下为60)运行一个函数(f),如果一个存在,它将关闭一个活动的数据库连接,并在完成时再次打开它。
我正在使用threading.timer,虽然我在将连接传递给函数时遇到了麻烦,并且在某些情况下,该函数在没有其他任何运行的情况下重复运行。
该函数需要在完成后返回连接到全局变量,并且我发现很难将连接传递给函数并从函数中全局分配返回值,这是我相信threading.timer的工作方式:
enter code from socketIO_client import SocketIO
import logging
import json
import MySQLdb as mdb
import os
import threading
con = mdb.connect('localhost','username','password','databaseName')
cur = con.cursor()
def f(con):
if 'con' in globals():
con.close()
print ("Connection closed")
os.system('php -f /home/ubuntu/grab.php')
con = mdb.connect('localhost','username','password','databaseName')
cur = con.cursor()
print ("DB Connection opened")
con = mdb.connect('localhost','username','password','databaseName')
cur = con.cursor()
threading.Timer(60,f,con).start(); ######PROBLEM LINE
return con
def on_connect():
print "Connecting to database"
areas = ['EH','BE']
socketIO.emit('subscribe_areas', areas)
def on_message(answer):
print("\nNew message received")
array = (json.loads(answer))
print (array)
runningIdentity = array["value"]
berthID = array["to"]
area = array["area"]
if berthID:
query = ("SELECT crs FROM signalBerth WHERE signalBerth=\'%s\';"%(berthID))
cur.execute(("%s")%(query))
reply = cur.fetchall()
for row in reply:
crs= row[0]
query = "UPDATE service SET lastSeen = \'%s\' WHERE runningIdentity=\'%s"%(crs,runningIdentity)+"\';" #berthID == crs, need to alter
print (("%s")%(query))
cur.execute(("%s")%(query))
con.commit()
print("affected rows = {}".format(cur.rowcount))
socketIO = SocketIO('http://www.realtimetrains.co.uk', 41280) #opens connection
socketIO.on('connect', on_connect) #sends subscription
socketIO.on('message', on_message) #reads data, creates mysql and executes it
con = f(con) ######FIRST CALL TO FUNCTION
socketIO.wait() #Keeps connection openhere
错误:
回溯(最近一次呼叫最后):文件" input.py",第49行,in socketIO.wait()#Keeps connection打开文件" build / bdist.linux-x86_64 / egg / socketIO_client / init .py",第175行, 在等待文件 " build / bdist.linux-x86_64 / egg / socketIO_client / init .py",第194行, 在_process_events文件中 " build / bdist.linux-x86_64 / egg / socketIO_client / init .py",第202行, 在_process_packet文件中 " build / bdist.linux-x86_64 / egg / socketIO_client / init .py",第327行, 在_on_event文件" input.py",第36行,在on_message中 cur.execute(("%s")%(查询))文件" /usr/lib/python2.7/dist-packages/MySQLdb/cursors.py" ;,第155行,在 执行 charset = db.character_set_name() _mysql_exceptions.InterfaceError:(0,'')线程中的异常Thread-1:Traceback(最近一次调用最后一次):File " /usr/lib/python2.7/threading.py",第810行,在__bootstrap_inner中 self.run()File" /usr/lib/python2.7/threading.py" ;,第1082行,在运行中 self.function(* self.args,** self.kwargs)TypeError:*之后的f()参数必须是序列,而不是连接
也许有一种更适合我的需求的方法,但重要的是连接关闭,功能运行和连接每分钟左右再次打开。想到一个cron工作,但我宁愿让我的代码完成所有工作。
答案 0 :(得分:1)
根据Timer object,其第三个参数是args
。这是一个列表,但您只传递了con
您需要用以下内容替换问题:
threading.Timer(60, f, (con,)).start()