Python多线程的运行及time.sleep()的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Python多线程的运⾏及time.sleep()的应⽤

已知⼩明和其弟弟⼩⽩每⽉都需要⽣活费,⼆⼈同时从同⼀个账户中取钱,两⼈每⼈每⽉需要1000元,账户中现有余额3200元,如果卡内余额⼤于2000元,则⽗母不会存⼊,如果卡内余额⼩于2000元,则⽗母当⽉会向卡内⼀次存⼊3500元。4个⽉后,卡内所剩余额是多少?

这道题可以运⽤多线程互相抢夺的性质来写

import threading

import time

lock=threading.Lock()

money=3200

def take(name):

for i in range(4):

print(i)

global money

lock.acquire()

money-=1000

print(name,"取⾛1000元,卡⾥余额是:",money)

lock.release()

time.sleep(1.1)

def save():

global money

for i in range(4):

if money>2000:

pass

else:

money+=3500

print("⽗母存⼊了3500元钱,卡内余额为:",money)

time.sleep(1)

t1=threading.Thread(target=save)

t2=threading.Thread(target=take,args=("⼩明",))

t3=threading.Thread(target=take,args=("⼩⽩",))

t1.start()

t2.start()

t3.start()

因为for循环写在锁外,所以i会成为抢夺的对象,同时每个线程都会将循环⼀遍,当循环的范围⼤时,会乱序,但是每个线程都会循环⼀遍,结果如下

def take(name):

for i in range(4):

print(i)

global money

lock.acquire()

money-=1000

print(name,"取⾛1000元,卡⾥余额是:",money)

lock.release()

#time.sleep(1.1)

⼩明取⾛1000元,卡⾥余额是: 2200

1

⼩明取⾛1000元,卡⾥余额是: 1200

2

⼩明取⾛1000元,卡⾥余额是: 200

3

⼩明取⾛1000元,卡⾥余额是: -800

⼩⽩取⾛1000元,卡⾥余额是: -1800

1

⼩⽩取⾛1000元,卡⾥余额是: -2800

2

⼩⽩取⾛1000元,卡⾥余额是: -3800

3

⼩⽩取⾛1000元,卡⾥余额是: -4800

time.sleep()的作⽤

由上边结果可以看出两个线程都循环了四次,⽽⼩明和⼩⽩这四个⽉每个⽉都需要取钱,所以两个⼈都需要取四次,⽽且每个⽉取的钱数也是⼀样的,他们可以运⾏同⼀个函数,这样显得简洁⼜⾼⼤上,因此可以通过线程抢夺的性质和线程休眠来做这道题。

使⽤time.sleep()是为了让两个线程运⾏的顺序成为(以i为代表)0,0,1,1,2,2,3,3。当⼩明或⼩⽩抢到时,它通过锁取完钱后,执⾏到sleep(),这个线程就会休眠,这时就剩另外⼀个线程来运⾏,当它取完钱,同样休眠,⽗母存钱的线路也是同样的。

⼀个线程运⾏⼀次就休眠,让路给其他没运⾏过的线程让他们来运⾏,从⽽使他们可以⼏个线程⼀循环,例如,t1,t2,t3三个线程,他的运⾏顺序就是(t1,t2,t3),(t1,t2,t3),(t1,t2,t3(这三个线程的顺序是乱序的,没有规律))····

最终完整的代码结果为

⼩明取⾛1000元,卡⾥余额是: 2200

⼩⽩取⾛1000元,卡⾥余额是: 1200

⽗母存⼊了3500元钱,卡内余额为: 4700 1

⼩⽩取⾛1000元,卡⾥余额是: 3700

1

⼩明取⾛1000元,卡⾥余额是: 2700

2

⼩⽩取⾛1000元,卡⾥余额是: 1700

2

⼩明取⾛1000元,卡⾥余额是: 700

⽗母存⼊了3500元钱,卡内余额为: 4200 3

3

⼩⽩取⾛1000元,卡⾥余额是: 3200

⼩明取⾛1000元,卡⾥余额是: 2200

相关文档
最新文档