0

I'm trying to run a function (f) every x seconds (in my case 60) which will close an active database connection if one exists and upon completion opens it again.

I am using threading.timer although I'm having trouble passing the connection into the function, and in some situations the function runs repeatedly with nothing else running.

The function needs to return the connection to globals after it completes and I'm finding it hard to pass the connection to the function and assign the return globally from within the function which is how I believe the threading.timer works:

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

Error:

Traceback (most recent call last): File "input.py", line 49, in socketIO.wait() #Keeps connection open File "build/bdist.linux-x86_64/egg/socketIO_client/init.py", line 175, in wait File "build/bdist.linux-x86_64/egg/socketIO_client/init.py", line 194, in _process_events File "build/bdist.linux-x86_64/egg/socketIO_client/init.py", line 202, in _process_packet File "build/bdist.linux-x86_64/egg/socketIO_client/init.py", line 327, in _on_event File "input.py", line 36, in on_message cur.execute(("%s")%(query)) File "/usr/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 155, in execute charset = db.character_set_name() _mysql_exceptions.InterfaceError: (0, '') Exception in thread Thread-1: Traceback (most recent call last): File "/usr/lib/python2.7/threading.py", line 810, in __bootstrap_inner self.run() File "/usr/lib/python2.7/threading.py", line 1082, in run self.function(*self.args, **self.kwargs) TypeError: f() argument after * must be a sequence, not Connection

Perhaps there is a more suited method to my needs, however the important bit it that the connection is closed, the function run and the connection opened again every minute or so. Thought about a cron job, but I'd rather keep my code doing everything.

1 Answer 1

1

According to Timer object, its third parameter is args. It is a list, but you pass only the con instead.
You need to replace your problem line with:

threading.Timer(60, f, (con,)).start()
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.