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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 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数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
18天前
|
调度 数据库 Python
Python异步编程入门:asyncio让并发变得更简单
Python异步编程入门:asyncio让并发变得更简单
85 5
|
3月前
|
监控 编译器 Python
如何利用Python杀进程并保持驻留后台检测
本教程介绍如何使用Python编写进程监控与杀进程脚本,结合psutil库实现后台驻留、定时检测并强制终止指定进程。内容涵盖基础杀进程、多进程处理、自动退出机制、管理员权限启动及图形界面设计,并提供将脚本打包为exe的方法,适用于需持续清理顽固进程的场景。
|
5月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
113 15
|
8月前
|
数据采集 Java 数据处理
Python实用技巧:轻松驾驭多线程与多进程,加速任务执行
在Python编程中,多线程和多进程是提升程序效率的关键工具。多线程适用于I/O密集型任务,如文件读写、网络请求;多进程则适合CPU密集型任务,如科学计算、图像处理。本文详细介绍这两种并发编程方式的基本用法及应用场景,并通过实例代码展示如何使用threading、multiprocessing模块及线程池、进程池来优化程序性能。结合实际案例,帮助读者掌握并发编程技巧,提高程序执行速度和资源利用率。
360 0
|
11月前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
11月前
|
API 数据处理 Python
探秘Python并发新世界:asyncio库,让你的代码并发更优雅!
在Python编程中,随着网络应用和数据处理需求的增长,并发编程变得愈发重要。asyncio库作为Python 3.4及以上版本的标准库,以其简洁的API和强大的异步编程能力,成为提升性能和优化资源利用的关键工具。本文介绍了asyncio的基本概念、异步函数的定义与使用、并发控制和资源管理等核心功能,通过具体示例展示了如何高效地编写并发代码。
286 2
|
11月前
|
数据库 开发者 Python
“Python异步编程革命:如何从编程新手蜕变为并发大师,掌握未来技术的制胜法宝”
【10月更文挑战第25天】介绍了Python异步编程的基础和高级技巧。文章从同步与异步编程的区别入手,逐步讲解了如何使用`asyncio`库和`async`/`await`关键字进行异步编程。通过对比传统多线程,展示了异步编程在I/O密集型任务中的优势,并提供了最佳实践建议。
77 1
|
11月前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
585 1
|
12月前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
11月前
|
监控 JavaScript 前端开发
python中的线程和进程(一文带你了解)
欢迎来到瑞雨溪的博客,这里是一位热爱JavaScript和Vue的大一学生分享技术心得的地方。如果你从我的文章中有所收获,欢迎关注我,我将持续更新更多优质内容,你的支持是我前进的动力!🎉🎉🎉
146 0