Python多執行緒同步---檔案讀寫控制
阿新 • • 發佈:2019-01-09
1、實現檔案讀寫的檔案ltz_schedule_times.py
#! /usr/bin/env python
#coding=utf-8
import os
def ReadTimes():
res = []
if os.path.exists('schedule_times.txt'):
fp = open('schedule_times.txt', 'r')
else:
os.system('touch schedule_times.txt')
fp = open('schedule_times.txt', 'r' )
try:
line = fp.read()
if line == None or len(line)==0:
fp.close()
return 0
tmp = line.split()
print 'tmp: ', tmp
schedule_times = int(tmp[-1])
finally:
fp.close()
#print schedule_times
return schedule_times
def WriteTimes (schedule_times):
if schedule_times <= 10:
fp = open('schedule_times.txt', 'a+')#10以內追加進去
else:
fp = open('schedule_times.txt', 'w')#10以外重新寫入
schedule_times = 1
print 'write schedule_times start!'
try:
fp.write(str(schedule_times)+'\n')
finally:
fp.close()
print 'write schedule_times finish!'
if __name__ == '__main__':
schedule_times = ReadTimes()
#if schedule_times > 10:
# schedule_times = 0
print schedule_times
schedule_times = schedule_times + 1
WriteTimes(schedule_times)
2.1、不加鎖對檔案進行多執行緒讀寫。file_lock.py
#! /usr/bin/env python
#coding=utf-8
from threading import Thread
import threading
import time
from ltz_schedule_times import *
#1、不加鎖
def lock_test():
time.sleep(0.1)
schedule_times = ReadTimes()
print schedule_times
schedule_times = schedule_times + 1
WriteTimes(schedule_times)
if __name__ == '__main__':
for i in range(5):
Thread(target = lock_test, args=()).start()
得到結果:
0
write schedule_times start!
write schedule_times finish!
tmp: tmp: tmp: tmp: [[[['1''1''1''1']]]]
11
1
1
write schedule_times start!write schedule_times start!
write schedule_times start!write schedule_times start!
write schedule_times finish!
write schedule_times finish!
write schedule_times finish!write schedule_times finish!
檔案寫入結果:
以上結果可以看出,不加鎖多執行緒讀寫檔案會出現錯誤。
2.2、加鎖對檔案進行多執行緒讀寫。file_lock.py
#! /usr/bin/env python
#coding=utf-8
from threading import Thread
import threading
import time
from ltz_schedule_times import *
#2、加鎖
mu = threading.Lock() #1、建立一個鎖
def lock_test():
#time.sleep(0.1)
if mu.acquire(True): #2、獲取鎖狀態,一個執行緒有鎖時,別的執行緒只能在外面等著
schedule_times = ReadTimes()
print schedule_times
schedule_times = schedule_times + 1
WriteTimes(schedule_times)
mu.release() #3、釋放鎖
if __name__ == '__main__':
for i in range(5):
Thread(target = lock_test, args=()).start()
結果:
0
write schedule_times start!
write schedule_times finish!
tmp: ['1']
1
write schedule_times start!
write schedule_times finish!
tmp: ['1', '2']
2
write schedule_times start!
write schedule_times finish!
tmp: ['1', '2', '3']
3
write schedule_times start!
write schedule_times finish!
tmp: ['1', '2', '3', '4']
4
write schedule_times start!
write schedule_times finish!
檔案寫入結果:
達到讀寫效果。