我使用的是python线程,当查询mysql时,代码似乎在运行,并停留在一个无限循环中,没有返回错误

oxcyiej7  于 2023-02-01  发布在  Python
关注(0)|答案(1)|浏览(145)

我同时调用了两个函数,并且这些函数都被触发了,但是当进行mysql查询时,代码似乎在运行并停留在无限循环中,没有返回错误。
下面是我代码:

    • 主文件. py**
import threading
import siparis_kontrolu
import dolar_euro_guncelle

def dd1():
    print("a")
    siparis_kontrolu.siparis_kontrolu()

def dd2():
    print("b")
    dolar_euro_guncelle.dolar_euro_guncelle()

t1 = threading.Thread(target=dd1)
t2 = threading.Thread(target=dd2)

t1.start()
t2.start()
    • 西帕里斯控制台. py**
import mysql_db
def siparis_kontrolu():
    try:
        while True:
            print("test1")
            tum_kullanicilar = mysql_db.mysql_get_all("select * from users")
            print("test2")
    • 美元_欧元_贡塞勒. py**
import urllib.request
import json
import mysql_db
import time
import logla

def dolar_euro_guncelle():
    while True:
        try:
            print("f")
            data = urllib.request.urlopen(
                "https://finans.truncgil.com/today.json")
            for line in data:
                line = json.loads(line.decode('utf-8'))
                USD = round(float(line['USD']["Satış"].replace(",", ".")), 2)
                EUR = round(float(line['EUR']["Satış"].replace(",", ".")), 2)
                mysql_db.mysql_update("update variables set EUR='" +
                                      str(EUR)+"', USD='"+str(USD)+"' where id='4'")
            time.sleep(10)
            print("USD/EUR guncellendi.")
        except Exception as e:
            logla.logla(e, "dolar_euro_guncelle")
            print(e)
    • mysql_数据库. py**
from configparser import ConfigParser
import mysql.connector

config_file = 'config.ini'
config = ConfigParser()
config.read(config_file)

mydb = mysql.connector.connect(host=config['MYSQL']['DB_HOST'],
                               user=config['MYSQL']['DB_USERNAME'], passwd=config['MYSQL']['DB_PASSWORD'], database=config['MYSQL']['DB_DATABASE'])
mycursor = mydb.cursor(buffered=True, dictionary=True)

def mysql_update(sorgu):
    try:
        mycursor.execute(sorgu)
        mydb.commit()
    except Exception as e:
        print(e)

def mysql_get_all(sorgu):
    try:
        mycursor.execute(sorgu)
        return mycursor.fetchall()
    except Exception as e:
        print(e)

当我运行www.example.com时,这些内容被写入控制台:main.py these are written to the console:
项目a
B
f级
测试1
test2和USD/EUR guncellendi没有打印出来,我不知道到底出了什么问题,当我不使用线程直接触发siparis_kontrolu. py时,它工作正常
它保持图片中的样子,代码也没有停止,但是它没有做我想让它做的事情。

vd8tlhqk

vd8tlhqk1#

这看起来像是DB连接的并发问题(假设您的siparis_kontrolu.py没有因为try语句中缺少except/finally部分而引发语法错误,那么sleep也会丢失)。
“SELECT”语句与“Update”语句冲突。
结果是:每个线程都需要自己的数据库连接!
最简单的方法是在mysql_db.py中打开另一个数据库连接并创建另一个游标(也许另一个游标示例就足够了):

from configparser import ConfigParser
import mysql.connector

config_file = 'config.ini'
config = ConfigParser()
config.read(config_file)

mydb = mysql.connector.connect(host=config['MYSQL']['DB_HOST'],
                               user=config['MYSQL']['DB_USERNAME'], passwd=config['MYSQL']['DB_PASSWORD'], database=config['MYSQL']['DB_DATABASE'])
mycursor = mydb.cursor(buffered=True, dictionary=True)

mydb_upd = mysql.connector.connect(host=config['MYSQL']['DB_HOST'],
                               user=config['MYSQL']['DB_USERNAME'], passwd=config['MYSQL']['DB_PASSWORD'], database=config['MYSQL']['DB_DATABASE'])
mycursor_upd = mydb_upd.cursor(buffered=True, dictionary=True)

def mysql_update(sorgu):
    try:
        mycursor_upd.execute(sorgu)
        mydb_upd.commit()
    except Exception as e:
        print(e)

def mysql_get_all(sorgu):
    try:
        mycursor.execute(sorgu)
        return mycursor.fetchall()
    except Exception as e:
        print(e)

但是创建一个DbHandler类并在几个线程中使用它的示例会更简洁。

相关问题