Python多线程同步---文件读写控制方法

1、实现文件读写的文件ltz_schedule_times.py

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

#! /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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

#! /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()

得到结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

#! /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()

结果:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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!

文件写入结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jh035512

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值