已知小明和其弟弟小白每月都需要生活费,二人同时从同一个账户中取钱,两人每人每月需要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)

 

0
小明 取走1000元,卡里余额是: 2200
1
小明 取走1000元,卡里余额是: 1200
2
小明 取走1000元,卡里余额是: 200
3
小明 取走1000元,卡里余额是: -800
0
小白 取走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(这三个线程的顺序是乱序的,没有规律))····

  最终完整的代码结果为

0
小明 取走1000元,卡里余额是: 2200
0
小白 取走1000元,卡里余额是: 1200
父母存入了3500元钱,卡内余额为: 4700
1
小白 取走1000元,卡里余额是: 3700
1
小明 取走1000元,卡里余额是: 2700
2
小白 取走1000元,卡里余额是: 1700
2
小明 取走1000元,卡里余额是: 700
父母存入了3500元钱,卡内余额为: 4200
3
3
小白 取走1000元,卡里余额是: 3200
小明 取走1000元,卡里余额是: 2200

Python多线程的运行及time.sleep()的应用的更多相关文章

  1. python多线程编程

    Python多线程编程中常用方法: 1.join()方法:如果一个线程或者在函数执行的过程中调用另一个线程,并且希望待其完成操作后才能执行,那么在调用线程的时就可以使用被调线程的join方法join( ...

  2. Python 多线程教程:并发与并行

    转载于: https://my.oschina.net/leejun2005/blog/398826 在批评Python的讨论中,常常说起Python多线程是多么的难用.还有人对 global int ...

  3. python多线程

    python多线程有两种用法,一种是在函数中使用,一种是放在类中使用 1.在函数中使用 定义空的线程列表 threads=[] 创建线程 t=threading.Thread(target=函数名,a ...

  4. python 多线程就这么简单(转)

    多线程和多进程是什么自行google补脑 对于python 多线程的理解,我花了很长时间,搜索的大部份文章都不够通俗易懂.所以,这里力图用简单的例子,让你对多线程有个初步的认识. 单线程 在好些年前的 ...

  5. python 多线程就这么简单(续)

    之前讲了多线程的一篇博客,感觉讲的意犹未尽,其实,多线程非常有意思.因为我们在使用电脑的过程中无时无刻都在多进程和多线程.我们可以接着之前的例子继续讲.请先看我的上一篇博客. python 多线程就这 ...

  6. 【python,threading】python多线程

    使用多线程的方式 1.  函数式:使用threading模块threading.Thread(e.g target name parameters) import time,threading def ...

  7. Python多线程和Python的锁

    Python多线程 Python中实现多线程有两种方式,一种基于_thread模块(在Python2.x版本中为thread模块,没有下划线)的start_new_thread()函数,另一种基于th ...

  8. 【跟我一起学Python吧】Python 多线程

    其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: from time import ctim ...

  9. 关于python多线程编程中join()和setDaemon()的一点儿探究

    关于python多线程编程中join()和setDaemon()的用法,这两天我看网上的资料看得头晕脑涨也没看懂,干脆就做一个实验来看看吧. 首先是编写实验的基础代码,创建一个名为MyThread的  ...

随机推荐

  1. Python cv2库(人脸检测)

    根据访问图片识别 # coding:utf-8 import sysimport math import cv2 # 待检测的图片路径 imagepath = r'l.png' face_cascad ...

  2. mpvue学习笔记(一) 基础介绍

    一. 小程序环境搭建 后台地址:https://mp.weixin.qq.com/ 文档地址:https://developers.weixin.qq.com/miniprogram/dev/ 注册账 ...

  3. easyui 面板title 加东西

  4. js的事件流事件机制

    (1)冒泡型事件:事件按照从最特定的事件目标到最不特定的事件目标(document对象)的顺序触发. IE 5.5: div -> body -> document IE 6.0: div ...

  5. springboot秒杀课程学习整理1-2

    1)从数据库到前端,做了三层转换,最后统一返回给前端的格式 DO-> model: 放在service中,目的是为了组装来自于数据库的数据,有些字段来自于不同的表的取,这一层相当于真正的业务模型 ...

  6. go报错unimplemented: 64-bit mode not compiled in与mingw 64位安装报错ERROR res已解决

    问题一:cc1.exe: sorry, unimplemented: 64-bit mode not compiled in 参考:https://www.cnblogs.com/lesroad/p/ ...

  7. 外贸站全球网速测试+免费CDN使用教程

    关于外贸网站速度测试,以前一全老师(www.yiquanseo.com)也讲到过,但是在那篇文章中推荐给大家的两个测试网站(https://developers.google.com/speed/pa ...

  8. JS-构造函数模式代码实战和总结-极客

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. MyBatis最原始的实现curd的操作

    关于jdbc的缺点: 1.数据库链接创建释放频繁造成系统资源浪费从而影响系统性能.如果使用数据库连接池可以解决此问题. 2.sql语句在代码中硬编码,不利于维护,sql变动需要改变java代码 3.使 ...

  10. 模拟post/get请求 类似于google的postman

    下载地址:https://www.getpostman.com/apps