多线程(thread+queue 售票)
一、理解
如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起。
可以理解为,每task_done一次 就从队列里删掉一个元素,这样在最后join的时候根据队列长度是否为零来判断队列是否结束,从而执行主线程。
#!/usr/bin/env python
# -*- coding:utf-8 -*- import time
from threading import Thread
from queue import Queue tickets = 100
# 队列中,可以放任意类型的数据,线程安全
tickets_queue = Queue(100)
# 声明退出条件
exitFlag = False class TicketsThread(Thread): def __init__(self, thread_id, sell_tickets_queue):
super().__init__()
self.thread_id = thread_id
self.sell_tickets_queue = sell_tickets_queue # 代码在run中执行,run中完善功能
def run(self):
super().run()
global tickets
global exitFlag
while True:
# 线程退出的条件
if exitFlag:
break # 获取队列中数据
# Queue特点,取出来,没了
try:
tickets = self.sell_tickets_queue.get(block=False)
print('线程:--------%d--------已卖票:%d' % (self.thread_id, tickets))
time.sleep(1)
# 通知队列,任务结束
self.sell_tickets_queue.task_done()
except Exception as e:
pass if __name__ == '__main__':
'''
多个线程,执行同一个任务
100url,一个线程,可以
10个线程,执行现在请求,优化
卖票,多线程
10个窗口帮助我们卖票
'''
for i in range(1, 101):
# 向队列中放入100张票
tickets_queue.put(i) # 创建10个线程,让10个线程一起执行买票
for i in range(1, 11):
# 创建卖票线程,并且启动
my_thread = TicketsThread(i, tickets_queue)
# 启动,线程中的run方法,就开始执行
my_thread.start() # join():判断队列是否为空,如果为空,程序继续向下执行,如果不为空,继续等待。(可以理解为队列锁)
tickets_queue.join()
exitFlag = True
多线程+队列锁=>买票
多线程(thread+queue 售票)的更多相关文章
- 多线程-Thread和ThreadPool
多线程原理 多线程都是基于委托的. 多线程优缺点 缺点: 1.导致程序复杂,开发调试维护困难,特别是线程交互. 2.线程过多导致服务器卡死,因为占用CPU 内存等资源. 优点: 1.良好的交互,特别对 ...
- Perl线程队列:Thread::Queue
(Thread::Queue)队列数据结构(FIFO)是线程安全的,它保证了某些线程从一端写入数据,另一些线程从另一端读取数据.只要队列已经满了,写入操作就自动被阻塞直到有空间支持写操作,只要队列空了 ...
- c#中@标志的作用 C#通过序列化实现深表复制 细说并发编程-TPL 大数据量下DataTable To List效率对比 【转载】C#工具类:实现文件操作File的工具类 异步多线程 Async .net 多线程 Thread ThreadPool Task .Net 反射学习
c#中@标志的作用 参考微软官方文档-特殊字符@,地址 https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/toke ...
- 2.匿名类,匿名类对象,private/protected/public关键字、abstract抽象类,抽象方法、final关键字的使用,多线程Thread类start方法原理
package com.bawei.multithread; //注意:模板方法我们通常使用抽象类或者抽象方法!这里我们为了方便在本类中使用就没有使用抽象类/抽象方法 public class Tem ...
- 爬虫相关基础技术铺垫---多线程Thread和队列Queue应用
from queue import Queue from threading import Thread class mydownloader(Thread): def __init__(self,q ...
- java 多线程--- Thread Runnable Executors
java 实现多线程的整理: Thread实现多线程的两种方式: (1)继承 Thread类,同时重载 run 方法: class PrimeThread extends Thread { long ...
- android 多线程Thread,Runnable,Handler,AsyncTask
先看两个链接: 1.http://www.2cto.com/kf/201404/290494.html 2. 链接1: android 的多线程实际上就是java的多线程.android的UI线程又称 ...
- [java多线程] - Thread&Runnable运用
负载是一个很大的话题,也是一个非常重要的话题.不管是在大的互联网软件中,还是在一般的小型软件,都对负载有一定的要求,负载过高会导致服务器压力过大:负载过低又比较浪费服务器资源,而且当高请求的时候还可能 ...
- python ---多线程thread
thread 在数据预处理的时候用处不大,因为有GIL 锁 查看thread信息 import threading print(threading.current_thread()) print(th ...
随机推荐
- dotnetcore配置框架简介
一.前言 配置的本质就是字符串的键值对,微软的一系列接口其实就是对这些键值对字符串的抽象. 二.基本类型 2.1.Nuget包 Microsoft.Extensions.Configuration.A ...
- I/O多路复用之select,poll,epoll简介
一.select 1.起源 select最早于1983年出现在4.2BSD中(BSD是早期的UNIX版本的分支). 它通过一个select()系统调用来监视多个文件描述符的数组,当select()返回 ...
- Next.js 7发布,构建速度提升40%
Next.js团队发布了其开源React框架的7版本.该版本的Next.js主要是改善整体的开发体验,包括启动速度提升57%.开发时的构建速度提升40%.改进错误报告和WebAssembly支持. \ ...
- Shiro踩坑记(二):使用RequiresXXX的注解后,访问对应请求返回404
问题描述: 我在项目中的某个Controller上添加了@RequirePermissions注解,希望在执行该请求前,可以先进行权限验证.但是当我请求该Controller时,返回的确是404错误. ...
- Radix_Sort
public class Radix_sort { public static void sort(int[] arrays,int radix){ int n = 1; int length = a ...
- 【K8S】K8S部署Metrics-Server服务
写在前面 在新版的K8S中,系统资源的采集均使用Metrics-Server服务,可以通过Metrics-Server服务采集节点和Pod的内存.磁盘.CPU和网络的使用率等信息. 读者可参考< ...
- 初识DP动态规划
一.多阶段决策过程的最优化问题 在现实生活中,有类活 动的过程,由于 它的特殊性,可将过程分成若干个互相阶段.在它的每一阶段都需要作出决策,从而使整个过程达到最好的活动效果.当阶段决策的选取不是任意确 ...
- POJ 1845-Sumdiv(厉害了这个题)
Description Consider two natural numbers A and B. Let S be the sum of all natural divisors of A^B. D ...
- C. Cave Painting(最小公倍数的应用)
\(\color{Red}{网上的题解都是投机取巧啊,虽然也没错}\) \(Ⅰ.先说一下投机取巧的方法\) \(自己写几个例子会发现k很小的时候满足条件的n就变得很大\) \(所以我们直接暴力从1判断 ...
- 解决编码问题:AttributeError: 'str' object has no attribute 'decode'
1. 问题发现: 出现:读取文件,对其进行解码,出现错误,AttributeError: 'str' object has no attribute 'decode' 解释:属性错误,str对象不包含 ...