gpt4 book ai didi

python - 无法在 python 线程中连接到 MySQL(在主线程上正常)

转载 作者:行者123 更新时间:2023-11-29 10:37:17 25 4
gpt4 key购买 nike

问题简而言之: MySQLdb.connect() 在主线程中工作,在其他线程中不起作用。

我有一个名为 Bot 的类,其中包含一些方法。像这样的东西:

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

我有一个线程类,它接受 Bot 对象和 task_name 并在 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

我尝试了 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 ,代码将恢复并按预期工作。有人知道这样的行为吗?

最佳答案

您的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

关于python - 无法在 python 线程中连接到 MySQL(在主线程上正常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46200206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com