2017-09-13 40 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

感謝,但第一個是一個錯字,它不喜歡的是,在實際的代碼。但你的第二點是一個很好的建議,謝謝你, –

相關問題