Python多进程并发写入PostgreSQL数据表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 1、前言      前两天开了两个进程,把Python抓回的数据链接并发写入Mysql中,结果显示出错。后来一查才知道需要自己设置锁,好生麻烦。这时PostgreSQL进入了我的视野,因为这家伙原生就是多进程的,但它是否支持多进程并发写入呢,还需要实际实验一下才知道。

1、前言
      前两天开了两个进程,把Python抓回的数据链接并发写入Mysql中,结果显示出错。后来一查才知道需要自己设置锁,好生麻烦。这时PostgreSQL进入了我的视野,因为这家伙原生就是多进程的,但它是否支持多进程并发写入呢,还需要实际实验一下才知道

2、安装PostgreSQL
     第一步,进入官网:http://www.postgresql.org/,点击Download
     第二步,选择操作系统对应的版本


      第三步,我选择的Windows平台,因此下载说明该套件还包括视窗管理工具pgAdmin III。

      继续下载,我选择的是64位,然后安装。接下来就是用pgAdmin创建数据库和表,老一套了,在此省略不表。

3、编写Python脚本
     首先,需要安装 Psycopg,这是Python访问PostgreSQL的链接库。官网上说windows版本需要下载安装包,其实也有pip的安装方式:

点击(此处)折叠或打开

  1. pip install psycopg2
      遗憾的是pip方式出现了问题,不知道是不是阅兵时的网络问题。

      所以,我选择下载安装包:

4、测试结果
      写入测试结果显示:可以实现两个进程对同一数据表的并发写入


     但是,我也将同样的代码跑了一下Mysql,发现并发的很好。。。郁闷

     所以,现在要更多的测试
  1. # -*- coding: utf-8 -*-
  2. import threading,time
  3. #import psycopg2
  4. import MySQLdb
  5. import string

  6. def multiGet(who):
  7.     start = time.clock()
  8.     #conn = psycopg2.connect(user='postgres',password='123456',database='links',host='localhost',port="5432")
  9.     conn = MySQLdb.connect(host='localhost',user='root',passwd='',db='rmrb')
  10.     cursor = conn.cursor()
  11.     for i in range(1000):
  12.         sql = "INSERT INTO delta (ID,WHO) VALUES (NULL, '" + who + "' );"
  13.         cursor.execute(sql)
  14.     conn.commit()
  15.     cursor.close()
  16.     conn.close()
  17.     end = time.clock()
  18.     print who + " processing time is: %f s" % (end - start)

  19. task1 = threading.Thread(target = multiGet, args = ("a"))
  20. task1.start()
  21. task2 = threading.Thread(target = multiGet, args = ("b"))
  22. task2.start()
      这时,出现了问题,主要是关键字段ID不能为空。所以,改善一下代码:
  1. # -*- coding: utf-8 -*-
  2. import threading,time
  3. #import psycopg2
  4. import MySQLdb
  5. import string

  6. def multiGet(who):
  7.     start = time.clock()
  8.     #conn = psycopg2.connect(user='postgres',password='123456',database='links',host='localhost',port="5432")
  9.     conn = MySQLdb.connect(host='localhost',user='root',passwd='',db='rmrb')
  10.     cursor = conn.cursor()
  11.     for i in range(1000):
  12.         if who == 'a':
  13.             sql = "INSERT INTO delta (ID,WHO) VALUES (" + str(i) + ", '" + who + "' );"
  14.         else:
  15.             sql = "INSERT INTO delta (ID,WHO) VALUES (" + str(i+1000) + ", '" + who + "' );"
  16.         cursor.execute(sql)
  17.     conn.commit()
  18.     cursor.close()
  19.     conn.close()
  20.     end = time.clock()
  21.     print who + " processing time is: %f s" % (end - start)

  22. task1 = threading.Thread(target = multiGet, args = ("a"))
  23. task1.start()
  24. task2 = threading.Thread(target = multiGet, args = ("b"))
  25. task2.start()
      Mysql的结果如下:
      上述结果是最后全部写入的,改成每条都commit呢?结果如下:
  1. b processing time is: 0.161019 sa processing time is: 0.162407 s
     但是,这是InnoDB引擎的结果,数据量特大时,这个引擎超级慢。所以设置为MyISAM再试试。
  1. a processing time is: 0.160377 sb processing time is: 0.159764 s
      速度加快了,程度的调度其实还是分片,a一片然后b一片。

4、结论
     看来Mysql足够,只是需要在关键字段的设置上做好功夫就可以。



相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
6月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
81 3
|
6月前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
41 1
|
3月前
|
SQL 关系型数据库 数据库
使用 PostgreSQL 和 Python 实现数据库操作
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现数据库操作
|
3月前
|
关系型数据库 数据库 PostgreSQL
使用 PostgreSQL 和 Python 实现全文搜索
【10月更文挑战第2天】使用 PostgreSQL 和 Python 实现全文搜索
40 1
|
4月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
5月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
4月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
4月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
84 0
|
5月前
|
数据采集 数据可视化 数据挖掘
【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】
【python】python知名品牌调查问卷数据分析可视化(源码+调查数据表)【独一无二】
116 1
|
5月前
|
SQL Shell API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API
python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API