Python多线程的运行及time.sleep()的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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