2017-09-13 3 views
0

Problème en bref:MySQLdb.connect() fonctionne sur le thread principal, ne fonctionne pas dans les autres threads.Impossible de se connecter à MySQL dans un thread en python (très bien sur le thread principal)

J'ai une classe appelée Bot avec certaines méthodes. quelque chose comme ceci:

class Bot(): 
    def task1(): 
     read_from_db() 
     # some other work 
    def task2(): 
     read_from_db() 
     # some other work 

et moi avons une classe de fil qui accepte un objet et un Bottask_name et commence la tâche sur l'objet bot.

class taskThread (threading.Thread): 
def __init__(self, bot, task): 
    threading.Thread.__init__(self) 
    self.bot = bot 
    self.task = task 
def run(self): 
    print "Starting " + self.task + " for " + self.bot.username 

    if self.task == "task1": 
     self.bot.task1() 

    elif self.task == "task2": 
     self.bot.task2() 
    print "Exiting " + self.task + " for " + self.bot.username 

J'ai essayé tout en read_from_db() mais il ne fonctionne pas dans un fil. il fonctionne très bien si je l'appelle bot.task1() en fil mais si je crée un objet MyThread et lui dire de courir Task1 il arrête exactement sur MySQLdb.connect() ligne sans erreur. ça s'arrête juste. J'ai cherché beaucoup mais je n'ai rien trouvé.

modifier: weirdly lorsque le code est arrêté juste avant la création d'une connexion à db, si j'appuyez sur Ctrl + c dans le terminal (où je courais le code) reprend le code et fonctionne comme prévu. Quelqu'un connaît-il un tel comportement?

Répondre

1

Vous avez un problème avec votre def run(self):. Vous référencez une variable task qui n'est pas définie. Vous voulez dire self.task:

# Consider renaming: it's more standard to have `TaskThread` 
class taskThread (threading.Thread): 
    # Init is fine 
    def run(self): 
     print "Starting " + self.task + " for " + self.bot.username 

     # It used to be just 'task'. Make it self.task 
     if self.task == "task1": 
      self.bot.task1() 

     elif self.task == "task2": 
      self.bot.task2() 
     print "Exiting " + self.task + " for " + self.bot.username 

Vous pouvez également envisager:

def run(self): 
     print "Starting " + self.task + " for " + self.bot.username 

     action = getattr(self.bot, self.task) 
     action() 
     print "Exiting " + self.task + " for " + self.bot.username 
+0

merci, mais la première était une faute de frappe, il est pas comme ça dans le code réel. mais votre deuxième point était une bonne suggestion, merci –