python 多线程笔记(4)-- 车站售票模拟
import threading
import time
import random class Worker(threading.Thread):
'''售票员'''
def __init__(self, wait_num=5, index=0):
super().__init__()
self.wait_num = wait_num # 当前排队人数
self.setName('窗口' + str(index)) # 窗口号 def run(self):
global counter, mutex while counter and self.wait_num: # 若有余票且有人排队
# ============================
# 窗口问询
# ============================
time.sleep(random.randrange(2,10)) # 比较耗时,时间随机 # ============================
# 出票
# ============================
mutex.acquire() # 锁住①
if counter == 0: # 如果票数为0
mutex.release() # 解锁③ -----> 这句很重要!!!
print(self.getName(), ':抱歉,票已售完')
break counter = counter - 1 # 票数减一
print('{}:当前余票 {} 张'.format(self.getName(), counter))
mutex.release() # 解锁③ # ============================
# 排队人数变化
# ============================
self.wait_num -= 1 # 排队人数减一
self.wait_num += random.randrange(0,2) # 排队人数随机增加 if __name__ == '__main__':
# 剩余车票数
counter = 20 # 创建锁
mutex = threading.Lock() # 开4个售票窗口
workers = []
for i in range(4):
wait_num = random.randrange(2,10) # 窗口前排队人数随机
workers.append(Worker(wait_num, i+1)) # 开始售票
for w in workers:
w.start() # 阻塞主程/后台静默?自己选
#for w in workers:
# w.join()
python 多线程笔记(4)-- 车站售票模拟的更多相关文章
- Python多线程笔记(三),queue模块
尽管在Python中可以使用各种锁和同步原语的组合编写非常传统的多线程程序,但有一种首推的编程方式要优于其他所有编程方式即将多线程程序组织为多个独立人物的集合,这些任务之间通过消息队列进行通信 que ...
- Python多线程笔记(一)
Python中使用threading模块来实现多线程 threading提供一些常用的方法 threading.currentThread() 返回当前的线程变量 threading.enumerat ...
- Python爬虫笔记【一】模拟用户访问之设置请求头 (1)
学习的课本为<python网络数据采集>,大部分代码来此此书. 网络爬虫爬取数据首先就是要有爬取的权限,没有爬取的权限再好的代码也不能运行.所以首先要伪装自己的爬虫,让爬虫不像爬虫而是像人 ...
- Python爬虫笔记【一】模拟用户访问之表单处理(3)
学习的课本为<python网络数据采集>,大部分代码来此此书. 大多数网页表单都是由一些HTML 字段.一个提交按钮.一个在表单处理完之后跳转的“执行结果”(表单属性action 的值)页 ...
- python 多线程笔记(5)-- 生产者/消费者模式
我们已经知道,对公共资源进行互斥访问,可以使用Lock上锁,或者使用RLock去重入锁. 但是这些都只是方便于处理简单的同步现象,我们甚至还不能很合理的去解决使用Lock锁带来的死锁问题. 要解决更复 ...
- Python爬虫笔记【一】模拟用户访问之提交表单登入—第二次(7)
在第一次登入时遇到这个问题,页面验证码与下载下来需要识别的验证码不同的问题,从网上查寻说是叫验证码同步问题.发现是用cookie解决的,那次cookie介绍到通过cookie就可以实现时间戳同步问题, ...
- Python爬虫笔记【一】模拟用户访问之Tesseract-ocr验证码训练(5)
验证码处理之后就需要对处理的验证码进行识别训练,这里用Tesseract-ocr工具进行识别,用jTessBoxeditor进行训练生成模板. 一,对图片进行处理 利用上一篇代码对图片进行降噪处理,得 ...
- Python爬虫笔记【一】模拟用户访问之验证码清理(4)
清理图片,对图片进行二值化,去边框,去干扰线,去点 from PIL import Image from pytesseract import * from fnmatch import fnmatc ...
- Python爬虫笔记【一】模拟用户访问之设置处理cookie(2)
学习的课本为<python网络数据采集>,大部分代码来此此书. 做完请求头的处理,cookie的值也是区分用户和机器的一个方式.所以也要处理一下cookie,需要用requests模块,废 ...
随机推荐
- h5标签
1.<abbr> 标签指示简称或缩写,比如 "WWW" 或 "NATO". IE 6 或更早版本的 IE 浏览器不支持 <abbr> 标 ...
- DateConvertUtil 日期工具类
package com.hxqc.basic.dependency.util; import java.text.DateFormat; import java.text.ParseException ...
- 解决 php7下 igbinary_unserialize_ref: invalid reference 的bug
最近组内升级了PHP7,某个接口偶发502,看了下php的错误日志如下: igbinary_unserialize_ref: invalid reference >= Memcached::ge ...
- Python 模块化 from .. import 语句介绍 (二)
from语句 例一. from pathlib import Path,PosixPath print(dir()) print(Path) print(PosixPath) 运行结果: ['Path ...
- spring boot +druid数据库连接池配置
1.启动应用入口修改 增加servlet注解 import javax.sql.DataSource; import org.apache.ibatis.session.SqlSessionFacto ...
- 深度包检测(DPI)详细介绍
目录 简介 背景 流量识别 常用功能 具体功能 做法 特征识别 架构举例 部署方式 串接方式 并接方式 存在问题 检测引擎举例 参考文献 简介 DPI(Deep Packet Inspection)深 ...
- docker搭建本地私仓
环境centos7 docker-ce 18 启动仓库镜像 docker run -d -p 5000:5000 registry:2 docker images 通过docker tag 标识镜像 ...
- 菜鸟程序猿之IDEA快捷键
Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 “!”键Ctrl+E,最近的文件Ctrl+Shift+E,最近更改的文件Shift+Click,可以关闭文件Ctrl+[ ...
- 工具 | Axure基础操作 No.5
今天看了不少的关于产品思维的文章,甚有感悟.但是还是觉得一句话说的非常对,做产品就像游泳,你掌握了很多理论知识,只要一下水那些理论知识都没什么用,只有真正的一头扎进水里你才知道身体怎么去适应这样的感觉 ...
- ERP系统和MES系统的区别
公司说最近要上一套erp系统,说让我比较一下,erp系统哪个好,还有mes系统,我们适合上哪个系统,其实我还真的不太懂,刚接触erp跟mes的时候,对于两者的概念总是傻傻分不清楚,总是觉得既然都是为企 ...