1. 程式人生 > >Python多執行緒同步---檔案讀寫控制

Python多執行緒同步---檔案讀寫控制

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!

檔案寫入結果:
這裡寫圖片描述

達到讀寫效果。