天天看點

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的安裝方式:

點選(此處)折疊或打開

pip install psycopg2

      遺憾的是pip方式出現了問題,不知道是不是閱兵時的網絡問題。

Python多程式并發寫入PostgreSQL資料表

      是以,我選擇下載下傳安裝包:

Python多程式并發寫入PostgreSQL資料表

4、測試結果

      寫入測試結果顯示:可以實作兩個程序對同一資料表的并發寫入

Python多程式并發寫入PostgreSQL資料表

     但是,我也将同樣的代碼跑了一下Mysql,發現并發的很好。。。郁悶

Python多程式并發寫入PostgreSQL資料表

     是以,現在要更多的測試

# -*- coding: utf-8 -*-

import threading,time

#import psycopg2

import MySQLdb

import string

def multiGet(who):

    start = time.clock()

    #conn = psycopg2.connect(user='postgres',password='123456',database='links',host='localhost',port="5432")

    conn = MySQLdb.connect(host='localhost',user='root',passwd='',db='rmrb')

    cursor = conn.cursor()

    for i in range(1000):

        sql = "INSERT INTO delta (ID,WHO) VALUES (NULL, '" + who + "' );"

        cursor.execute(sql)

    conn.commit()

    cursor.close()

    conn.close()

    end = time.clock()

    print who + " processing time is: %f s" % (end - start)

task1 = threading.Thread(target = multiGet, args = ("a"))

task1.start()

task2 = threading.Thread(target = multiGet, args = ("b"))

task2.start()

      這時,出現了問題,主要是關鍵字段ID不能為空。是以,改善一下代碼:

        if who == 'a':

            sql = "INSERT INTO delta (ID,WHO) VALUES (" + str(i) + ", '" + who + "' );"

        else:

            sql = "INSERT INTO delta (ID,WHO) VALUES (" + str(i+1000) + ", '" + who + "' );"

      Mysql的結果如下:

Python多程式并發寫入PostgreSQL資料表

      上述結果是最後全部寫入的,改成每條都commit呢?結果如下:

b processing time is: 0.161019 sa processing time is: 0.162407 s

     但是,這是InnoDB引擎的結果,資料量特大時,這個引擎超級慢。是以設定為MyISAM再試試。

a processing time is: 0.160377 sb processing time is: 0.159764 s

      速度加快了,程度的排程其實還是分片,a一片然後b一片。

Python多程式并發寫入PostgreSQL資料表

4、結論

     看來Mysql足夠,隻是需要在關鍵字段的設定上做好功夫就可以。