1、前言
前兩天開了兩個程序,把Python抓回的資料連結并發寫入Mysql中,結果顯示出錯。後來一查才知道需要自己設定鎖,好生麻煩。這時PostgreSQL進入了我的視野,因為這家夥原生就是多程序的,但它是否支援多程序并發寫入呢,還需要實際實驗一下才知道。
2、安裝PostgreSQL
第一步,進入官網:http://www.postgresql.org/,點選Download

第二步,選擇作業系統對應的版本
第三步,我選擇的Windows平台,是以下載下傳說明該套件還包括視窗管理工具pgAdmin III。
繼續下載下傳,我選擇的是64位,然後安裝。接下來就是用pgAdmin建立資料庫和表,老一套了,在此省略不表。
3、編寫Python腳本
首先,需要安裝Psycopg,這是Python通路PostgreSQL的連結庫。官網上說windows版本需要下載下傳安裝包,其實也有pip的安裝方式:
點選(此處)折疊或打開
pip install psycopg2
遺憾的是pip方式出現了問題,不知道是不是閱兵時的網絡問題。
是以,我選擇下載下傳安裝包:
4、測試結果
寫入測試結果顯示:可以實作兩個程序對同一資料表的并發寫入
但是,我也将同樣的代碼跑了一下Mysql,發現并發的很好。。。郁悶
是以,現在要更多的測試
# -*- 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的結果如下:
上述結果是最後全部寫入的,改成每條都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一片。
4、結論
看來Mysql足夠,隻是需要在關鍵字段的設定上做好功夫就可以。