day11学python 多线程+queue
多线程+queue
两种定义线程方法
1调用threading.Thread(target=目标函数,args=(目标函数的传输内容))(简洁方便)
2创建一个类继承与(threading.Thread)并重构run()函数
class MyThread(threading.Thread):
def run(self): 1.直接调用函数方法实例
import threading,time def run(n):
print("test",n)
time.sleep(2)
start_time=time.time()
tall=[] #用作储存线程实例
for i in range(50):
t=threading.Thread(target=run,args=('t-%s'%i,))
t.setDaemon(True) #把当前线程设置为守护线程
t.start()
tall.append(t) # for t in tall:
# t.join()
print("time:",time.time()-start_time)
print(threading.active_count())
2.①继承类 ②实例化 示例
import threading,time
class MyThread(threading.Thread):
def __init__(self,n):
super(MyThread,self).__init__()
self.n=n
def run(self):
print("running task",self.n) t1=MyThread("t1")
t2=MyThread("t2")
t1.start()
t2.start()
补充:
1两个进程一起进行 线程.join()等待该线程执行完毕后 在进行之后操作
2整个程序有主线程,会和其他线程并行
3可将线程储存在数组里
4 t.setDaemon(True) #把当前线程设置为守护线程-主线程结束守护线程自动结束(主仆关系)
5 t.start()调用start函数代表线程开始
================================================
同步对象 event
可调用的函数
#event.wait() 使当前线程等待 直到被设定
#event.set() 设定标志位
#event.is_set() 判断是否被设定
#event.clear() 清除设定
以下是对红绿灯的示例
灯为一线程
车为一线程
import time
import threading
event=threading.Event()
def lighter():
count=0
event.set()
while True:
time.sleep(1)
if count>4 and count<10: #改为红灯
event.clear()
print("\033[41;1mred light is on...\033[0m")
elif count>=10:
event.set()
count=0
else:
print("\033[42;1mgreen light is on...\033[0m")
time.sleep(1)
count+=1
def car(name):
while True:
if event.is_set():
print(name,"is going")
time.sleep(1)
else:
print(name,"stop!")
event.wait()
car1=threading.Thread(target=car,args=("宝马",))
car1.start()
t=threading.Thread(target=lighter,)
t.start()
注意:
1先实例化event对象 event=threading.Event()
2利用上方红字4个event函数调用 达到多线程交互进行
3threading.Thread(target=car,args=("宝马",)) 在实例化线程时threading.Thread(target=调用的函数名,args=(参数,)) //必须使用元组形式
==========================================================
queue队列
q=queue.Queue(maxsize=5) 首先实例化队列 可以自定最大值需要maxsize=
1q.put() //向队列中塞一个
2q.get() //从队列中取一个
最多塞maxsize个 最少为0个 取一个后,此数据将不存在
以下是对queue的实例
提供者与两个消费者三线程
提供者最多产5个
import queue,threading,time
q=queue.Queue(maxsize=5)
def produce(name):
count=0
while True:
count+=1
# print(count)
q.put("%s生产%s个面包"%(name,count))
print("产了",count)
time.sleep(0.2)
def consumer(name):
while True:
print(name,"is eating ",q.get())
time.sleep(1)
a=threading.Thread(target=produce,args=("cf",))
b=threading.Thread(target=consumer,args=("xxx",))
c=threading.Thread(target=consumer,args=("sss",))
a.start()
b.start()
c.start()
注意:
q=queue.Queue(maxsize=5)务必使用前实例化!!
day11学python 多线程+queue的更多相关文章
- 一起学Python: 多线程-共享全局变量问题
多线程-共享全局变量问题 多线程开发可能遇到的问题 假设两个线程t1和t2都要对全局变量g_num(默认是0)进行加1运算,t1和t2都各对g_num加10次,g_num的最终的结果应该为20. 但是 ...
- 一起学Python:多线程-共享全局变量
多线程-共享全局变量 from threading import Thread import time g_num = 100 def work1(): global g_num for i in r ...
- C语言老司机学Python (六)- 多线程
前面的1-5都是比较基础的东西,能做的事情也有限. 从本节起,随着更多进阶技术的掌握,渐渐就可以用Python开始浪了. Python3使用threading模块来实现线程操作. 根据在其他语言处学来 ...
- Python中Queue模块及多线程使用
Python的Queue模块提供一种适用于多线程编程的FIFO实现.它可用于在生产者(producer)和消费者(consumer)之间线程安全(thread-safe)地传递消息或其它数据,因此多个 ...
- python多线程--优先级队列(Queue)
Python的Queue模块中提供了同步的.线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue.这些队列都实现 ...
- 用Queue控制python多线程并发数量
python多线程如果不进行并发数量控制,在启动线程数量多到一定程度后,会造成线程无法启动的错误. 下面介绍用Queue控制多线程并发数量的方法(python3). # -*- coding: utf ...
- python基础-12 多线程queue 线程交互event 线程锁 自定义线程池 进程 进程锁 进程池 进程交互数据资源共享
Python中的进程与线程 学习知识,我们不但要知其然,还是知其所以然.你做到了你就比别人NB. 我们先了解一下什么是进程和线程. 进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CP ...
- 【跟我一起学Python吧】Python 多线程
其实自我感觉Python的多线程很类似于Java的多线程机制,但是比JAVA的多线程更灵活.在早期的Python多线程实现中,采用了thread模块.例如: from time import ctim ...
- D10——C语言基础学PYTHON
C语言基础学习PYTHON——基础学习D10 20180906内容纲要: 1.协程 (1)yield (2)greenlet (3)gevent (4)gevent实现单线程下socket多并发 2. ...
随机推荐
- Mysql安装配置,修改初试密码。
绿色版本,解压缩 D:\Software\mysql-advanced-5.6.18-winx64 my-default.ini 改名my.ini my.ini内容如下 # For advice on ...
- jquery中ready函数,$(function(){})与自执行函数的区别
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- oracel 查询删除重复记录的几种方法
建表语句CREATE TABLE Persons(PersonID int, LastName varchar(255),FirstName varchar(255),Addres ...
- UV-Sprite动画
[UV-Sprite动画] 下文以单行Sprite纹理作为动画贴图.首先需要输入纹理宽度.Sprint数量.速度: 计算每个Sprite的像素宽与UV宽: 根据_Time,计算当前显示第几个Sprit ...
- 一张图片优化5k带来的带宽成本及其前端页面的优化方法
上周,我参加了公司的一门课程<网站性能优化>,讲师提出了一个问题:一张图片优化后减少5K,1年内可以大概省下多少宽带成本呢?非常好奇,仔细听完讲师分析,计算出来的数据让小伙伴们都惊呆了,仅 ...
- go_数组
go语言中数组是值类型 [10]int 和 [20]int 是不同类型,不能用作参数传递 调用func f(arr [10]int)会拷贝数组 go语言一般不用数组用切片slice package m ...
- JAVA中List的几个方法
add()方法.插入某个位置的数据,他有两个参数一个参数是下标,一个参数是元素.需要注意的是下标大小应该小于等于List集合大小,否则就会抛出下标越界异常! 代码: public static ...
- 快速上手Runtime(三)之方法交换
开发过程中,我们经常会用到系统类,而它提供的方法又不能完全满足我们开发的需要,那么在此时,我们需要为系统自带的方法扩展一些功能,而且还要保证原有的功能可正常使用.假设咱们现在有这么一个需求,我们在调用 ...
- spring mabatis springmvc 看过
.Spring中AOP的应用场景.Aop原理.好处? 答:AOP--Aspect Oriented Programming面向切面编程:用来封装横切关注点,具体可以在下面的场景中使用: Authent ...
- DPDK收发包全景分析
前言:DPDK收发包是基础核心模块,从网卡收到包到驱动把包拷贝到系统内存中,再到系统对这块数据包的内存管理,由于在处理过程中实现了零拷贝,数据包从接收到发送始终只有一份,对这个报文的管理在前面的mem ...