【问题标题】:How to insert async into MySQL using Python如何使用 Python 将异步插入 MySQL
【发布时间】:2012-11-09 12:53:43
【问题描述】:

已解决,每个greenlet应该有一个连接而不是共享同一个连接。

我想在 MySQL 数据库中插入大量数据。我使用gevent从互联网上下载数据,然后将数据插入MySQL。我发现 umysqldb 可以异步插入 MySQL。但是我收到以下错误:Mysql Error 0: Concurrent access in query method

我的代码如下:

def insert_into_mysql(conn,cur,pid,user,time,content):
    try: 
        value=[pid,user,time,content] 
        #print 'value is', value
        print 'hi'
        cur.execute('insert into post(id,user,time,content) values(%s,%s,%s,%s)',value) 
        print 'after execute'
        conn.commit() 
    # except MySQLdb.Error,e: 
    except umysqldb.Error,e: 
        print "Mysql Error %d: %s" % (e.args[0], e.args[1]) 

insert_into_mysql 包含在download_content 中:

while len(ids_set) is not 0:
    id = ids_set.pop()
    print 'now id is', id
    pool.spawn(download_content,conn,cur,int(id))
    r.sadd('visited_ids',id)
    pool.join()

【问题讨论】:

  • 你可以给标准mysqldb驱动打补丁,它应该是异步的,也见github.com/esnme/ultramysql
  • umysqldb 是一个 MySQLdb 兼容的 Ultramysql 包装器。

标签: python mysql gevent


【解决方案1】:

ultramysql 不允许您在同一个 mysql 连接上进行多个查询,它只是使其异步友好。因此,您需要为每个 greenlet 建立一个新的 mysql 连接,或者使用锁定原语来确保一次只有一个 greenlet 使用该连接。

【讨论】:

    猜你喜欢
    • 2018-11-12
    • 2014-04-18
    • 2018-03-02
    • 2011-05-14
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2015-12-29
    • 1970-01-01
    相关资源
    最近更新 更多