2017-09-13 44 views
0

问题简而言之:MySQLdb.connect()工作在主线程,不工作在其他线程。无法连接到python中的一个线程(主线程罚款)

我有一个叫做Bot的类,有一些方法。 是这样的:

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

和我有接受Bot对象和task_name并启动机器人对象的任务线程类。

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 

我想每一件事的read_from_db()但它不会在一个线程中运行。 它工作正常,如果我在主线程中调用bot.task1(),但如果我创建一个myThread对象,并告诉它运行task1它完全停止在MySQLdb.connect()行没有错误。它只是停止。

def read_from_db(): 
     db = MySQLdb.connect(host="localhost", 
         user="root", 
         passwd="", 
         db="db_name", 
         unix_socket="/opt/lampp/var/mysql/mysql.sock") 
    db.set_character_set('utf8') 

我搜查了很多,但我找不到任何东西。

编辑:古怪的代码时停权创建一个连接到数据库,如果我按Ctrl + C在终端(其中我跑的代码)的代码,并继续按预期工作之前。 有谁知道这样的行为?

回答

1

您的def run(self):存在问题。您正在引用未定义的task变量。你的意思是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 

您也可能要考虑:

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

感谢,但第一个是一个错字,它不喜欢的是,在实际的代码。但你的第二点是一个很好的建议,谢谢你, –

相关问题