Python线程计时器运行函数与传递变量

时间:2015-02-10 14:51:11

标签: function python-2.7

我试图每隔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工作,但我宁愿让我的代码完成所有工作。

1 个答案:

答案 0 :(得分:1)

根据Timer object,其第三个参数是args。这是一个列表,但您只传递了con 您需要用以下内容替换问题:

threading.Timer(60, f, (con,)).start()