我有一个名为“未处理”的表,我想在其中读取2000行,通过HTTP将它们发送到另一台服务器,然后将这些行插入“已处理”表并将其从“未处理”表中删除。

我的python代码大致如下:

db = MySQLdb.connect("localhost","username","password","database" )

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Select all the records not yet sent
sql = "SELECT * from unprocessed where SupplierIDToUse = 'supplier1' limit 0, 2000"
cursor.execute(sql)
results = cursor.fetchall()
for row in results:
  id = row[0]
  <code is here here for sending to other server - it takes about 1/2 a second>
  if sentcorrectly="1":
     sql = "INSERT into processed (id, dateprocessed) VALUES ('%s', NOW()')" % (id)
     try:
        inserted = cursor.execute(sql)
     except:
        print "Failed to insert"
     if inserted:
        print "Inserted"
        sql = "DELETE from unprocessed where id = '%s'" % (id)
        try:
            deleted = cursor.execute(sql)
        except:
            print "Failed to delete id from the unprocessed table, even though it was saved in the processed table."
db.close()
sys.exit(0)

我希望能够同时运行此代码,以便提高通过HTTP将这些记录发送到其他服务器的速度。 目前,如果我尝试同时运行代码,则会获得同一数据的多个副本,这些副本发送到另一台服务器的顶部,并保存到“已处理”表中,因为选择查询在代码的多个实例中获得相同的ID。

当选择记录时,如何将它们锁定,然后将每个记录作为一行处理,然后再将它们移到“已处理”表中,该如何锁定? 该表是MyISAM,但是我今天转换为innoDB了,因为我意识到可以使用innoDB更好地锁定记录。

===============>>#1 票数:1 已采纳

根据您的评论回复。

两种解决方案之一是客户端python主进程,该进程将收集所有2000条记录的记录ID,然后将其拆分为小块,以供子工作者处理。

简短的版本,您的选择是委派工作,还是依靠可能棘手的资产锁定机制。 我建议使用前一种方法,因为它可以借助消息队列进行扩展。

委托逻辑将使用多处理

import multiprocessing
records = get_all_unprocessed_ids()
pool = multiprocessing.Pool(5) #create 5 workers
pool.map(process_records, records) 

这将创建2000个任务并一次运行5个任务,或者您可以使用此处概述的解决方案将记录分成多个块, 如何将列表分成大小均匀的块?

pool.map(process_records, chunks(records, 100)) 

将创建100条记录的20个列表,将以5批处理

编辑:语法错误-签名是map(func,iterable [,chunksize]),我省略了func的参数。

  ask by 3G Telecoms translate from so

未解决问题?本站智能推荐:

1回复

更改my.cnf文件中的innodb_page_size不会重新启动mysql数据库

希望你有美好的一天。 我有一张包含470列的表格。 我正在进行Django单元测试,当我运行命令python manage.py test时,测试不会执行并给出错误: 行大小太大(> 8126)。 将某些列更改为TEXT或BLOB或使用ROW_FORMAT = DYNAMI
1回复

从Python缓慢插入MySQL

我正在尝试使用python(pymysql连接器)将一些数据插入MySQL数据库,而我的性能却真的很差(每秒插入约10行)。 该表是InnoDB,我正在使用多值insert语句,并确保已关闭自动提交。 为什么我的插入仍然这么慢的任何想法? 最初,我认为未正确禁用自动提交功能,但是我添加
2回复

使用innondb引擎从mysql数据库中的python脚本插入问题

我正面临一个问题,我试图使用InnonDB引擎将数据从python脚本添加到mysql数据库,它可以与mysql数据库的myisam引擎一起使用。 但myisam引擎的问题是它不支持外键,所以我必须在每个我想在数据库中插入/删除记录的位置添加额外的代码。 有谁知道为什么InnonDB不能
2回复

MySQL-Python复杂查询导致空集

我们有一个脚本在过去四年中运行良好。 它从SugarCRM应用程序中提取大量数据,然后打印一些报告。 我正在使用Python-MySQLDB提取数据。 问题是,SQL查询会在MySQL Shell以及phpmyadmin上执行,并以正确的值作为结果。 但是在python s
1回复

Django + InnoDB:模型读取随机失败

我在django有一个项目,该项目在开发服务器上运行良好,但在托管服务器上却没有。 由于我无权访问托管服务器上的控制台,因此通过将输出从python manage.py sql <app name>复制到托管服务器上phpMyAdmin的SQL查询部分中来创建表。 在我的
2回复

MySQLdb / Python INSERT查询不将数据插入表中

我试图通过Python使用以下代码将值插入表中: 我看到查询字符串正确填充了打印输出中的所有变量值(我没有对特殊字符做任何事情)。 但是这些值根本没有插入到数据库中。 我的表看起来像这样: 值得注意的是,AUTO_INCREMENT设置为132.我在几分钟前手动测试了一个插入
2回复

如果更改列名,MySQL将不会创建表

我正在使用python代码创建MySQL表。 我可以为列使用特定名称来创建表,但是一旦我要更改它们,就不再创建表。 此代码可以正常工作 一旦我决定将'sector'的名称更改为'sector1'或其他名称,MySQL便不再创建该表。 下面的代码不再创建该表。 运行代
2回复

数亿数据后MySQL / MariaDB的插入速度缓慢

我正在做一个项目,要求我生成数十亿个唯一代码。 目前,我将MariaDB与InnoDB引擎和python结合使用,以生成随机的唯一代码,每个生成周期插入一批5000个唯一的代码。 我的表结构: 问题:当我碰到5000亿个独特的代码时,插入变得非常缓慢,我仍然需要生成多达30亿个代
1回复

从MySQL 5.5升级到5.7后,查询更常遇到死锁

最近,我们使用AWS DMS服务将生产数据库迁移到版本从5.5升级到5.7的Amazon RDS。 之后,在重复的键更新查询和更新查询中,我们的插入操作经常遇到死锁问题。 而在MySQL 5.5中,它很小。 例如,说我们的表结构之一如下。 我们的插入查询如下... 我们
2回复

MySQL:Django .create后跟.get在没有重新打开shell的情况下无效

......重新开壳... 超级难倒在这里。 运行Python 2.7.3; Django 1.5.4; MySQL 5.5(innodb),Ubuntu 12.04。 此外,首先打开python shell,并对mysql运行insert语句会导致数据库中存在记录的类似情