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


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

2、安装PostgreSQL
     第一步,进入官网:http://www.postgresql.org/,点击Download
Python多进程并发写入PostgreSQL数据表
     第二步,选择操作系统对应的版本
Python多进程并发写入PostgreSQL数据表

      第三步,我选择的Windows平台,因此下载说明该套件还包括视窗管理工具pgAdmin III。
Python多进程并发写入PostgreSQL数据表

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

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

点击(此处)折叠或打开

  1. pip install psycopg2
      遗憾的是pip方式出现了问题,不知道是不是阅兵时的网络问题。
Python多进程并发写入PostgreSQL数据表

      所以,我选择下载安装包:
Python多进程并发写入PostgreSQL数据表

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

     但是,我也将同样的代码跑了一下Mysql,发现并发的很好。。。郁闷
Python多进程并发写入PostgreSQL数据表

     所以,现在要更多的测试
  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的结果如下:
Python多进程并发写入PostgreSQL数据表
      上述结果是最后全部写入的,改成每条都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一片。
Python多进程并发写入PostgreSQL数据表

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



上一篇:基于smack的即时聊天系统之登陆功能的实现


下一篇:python基础语法