首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将mysql连接传递给python线程时,管道中断

问将mysql连接传递给python线程时,管道中断
EN

Stack Overflow用户
提问于 2015-10-20 05:34:03
回答 1查看 2.9K关注 0票数 6

我正在尝试将mysql连接传递到python中的一个线程。如果我在worker类中初始化mysql,则没有错误。

但是,连接的代价可能很高,所以我尝试将mysql连接从调用方函数中传递出来(参见下面的代码)。但这会不断地抛出错误:

(2006年,"MySQL服务器已消失“(BrokenPipeError(32,‘断管’))

知道为什么吗?我认为这是因为我们通过mysql连接的方式

代码语言:javascript
复制
def worker(db):
""" Distributes the workload for a thread
"""
while True:
    item = queue_handler.get()
    perform_insert(item, db)
    queue_handler.task_done()

def insert_bulk(params):
""" Handles the insert
"""
    cntr = 0
    res = []
    cannot_read = []
    (data, cms, report_id) = params

    db = nmi_mysql.DB(CONFIG['earnings_db'], True)

    for i in range(10):
        thrd = threading.Thread(target=worker, args=(db,))
        thrd.deamon = True
        thrd.start()

    for row in data:
        split_files = row.split(',')

        if len(split_files) != 34:
            cannot_read.append(split_files)
            continue

        now = datetime.datetime.now()

        res.append(<some data to insert>)

        if len(res) == 750 or cntr == len(data):
            queue_handler.put([res, cms, report_id])
            res = []

        cntr += 1

    queue_handler.join()

    db.close()

    return [len(res), cms]

更新

我们没有传递mysql连接,而是创建了一个连接池,并在线程中使用该池。这样,我们就可以从线程级别的池中获得连接。

EN

回答 1

Stack Overflow用户

发布于 2016-02-06 19:30:45

数据库连接并不是线程安全的,所以您不应该将它们从一个线程传递到另一个线程。连接池保存在请求之间的打开连接,因此从池获取连接、将其用于查询并释放它会更快。

这个related answer在数据库连接的线程安全方面有一些有用的链接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33228743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档