python多线程队列两组数据_Python 的多线程(2) - 队列

人总是需要不停的工作的

首先自我介绍一下, 我叫裘千,大家都叫我QQ ,我今天 50 岁了,工作是一个搬尸人,这份工作已经做了10多年,早已经失去了对冰冷尸体的渴望了 。

ps : 为什么是渴望, 谁也不知道 . . .

老周和老L是 枪决执行者, 我就处理他们的尾事,我还有一个同伴,叫AA,因为他永远不会请客,和别人在一起吃永远都是AA制的,

ps : 很奇怪是吧,就是, 做这种工作的 能有几个正常的呢

活来了, 前几天冷冻库里多了几具尸体,有人会把它们搬出来,堆在一起,最后需要我们去他们埋

1. 先把尸体搬出来:

import threading

import time

import queue

import random

## 定义一个死人堆,这一堆只能放 10 个人

pitQueue = queue.Queue(10) # 这是一个队列

threadLock = threading.Lock()

isHasNewPit = True; #是否有新的尸体来了

#定义一个 死人堆,并往死人堆了放尸体,每${sec}秒就堆入一个

def offer(sec):

threadLock.acquire()

i=0

while True:

if i==7:

break

try:

if not pitQueue.full():

deadMans = {'name':'S'+str(i).zfill(3),'age':15+random.choice(range(50))}

time.sleep(sec) # 休眠的描述自己控制下,不然一边堆,一边拖,永远托不完了,会看不出效果

pitQueue.put(deadMans) # 把死刑犯扔里面去

print('堆入{0}成功'.format(deadMans['name']))

i+=1

if i==6:

time.sleep(3)

else:

print('死人堆已经满了,旁边等会或者往别的死人堆里放吧')

break

except e:

print("啊"*6 + "... 尸变啦,快跑啊 ...",e)

break

threadLock.release()

2. 再看下怎么干 好干,和一个休息等待的功能,万一冷冻库你的没搬完呢

# 干活啦 大家都干一样的活,就没必要放类里面了, 把尸体拖入坑中

def consume(li,data):

time.sleep(2) # 这里是真的用了两秒哦

print(" 工作人员{0},用了{1}秒,将死刑犯编号为:{2},年龄为{3}的尸体拖入坑中,顺便踩两了脚 ..."

.format(li['wn'],li['de'],data['name'],data['age']))

# 等会吧,万一还有尸体呢 。。。

def waiting(workName):

print("------> 小{0} 回到尸体堆旁,看到尸体堆已经空了, 打算等待5秒钟,如果5秒后没人来,就下班了".format(workName))

for i in range(5):

time.sleep(1)

print('{0}的{1}秒过去了 ...'.format(workName,i))

if pitQueue.empty():

print("5秒钟后,尸体堆还是空的...下班咯, 啦啦啦 ....")

return True

else :

print("5秒钟后,尸体堆怎么还有 啊 , 他妈的...累死老子了")

return False

3. 再定义一个干活的章程, 还要知道是谁搬的,耗时多久,这些工作信息,总不能都偷懒

#建一个干活线程类,继承 threading.Threadn

class WorkThreadingTest(threading.Thread):

##成员变量

workName='' #工作人员名称

de=0 # 休眠时间 , 单位秒

# 该类的构造方法

def __init__(self,wn,de):

threading.Thread.__init__(self) # 父类的构造,不同java的语法, 这里如果不写,会报错

self.workName=wn

self.de=de

#run 方法 类似java 的 run()

def run(self):

while True :

if not pitQueue.empty():

data = pitQueue.get()

if data: # 如果尸体对不为空 ,那么一直拖, 直到托完为止

li = {'wn':self.workName,'de':self.de}

consume(li,data)

else:

if waiting(self.workName):

break

else :

if waiting(self.workName):

break

4. 再来一个统一发号命令接受开始干活的入口

# 这个队伍的人陆续开始干活

def main():

# 定义一个拖尸体队伍 , 六大拖尸体金刚

workTeam = ['QQ','AA']

threads = [] # 所有线程的列表

time.sleep(3)

if not pitQueue.empty(): # 如果大家看到 尸体堆是空的, 就不要去干活啦,

for worker in workTeam:

second = 1 #random.choice(range(5))

thread = WorkThreadingTest(worker,second)

thread.start()

threads.append(thread)

else:

print("ps : 大家看到尸体堆是空的,就坐在旁边打屁吹牛啦,不用起来一个个过去看了 !!! \n")

for t in threads :

t.join()

print("Game over ... \n")

5. 这里有两波人嘛 ,自然有两个入口啦,自然需要两个入口线程了

# 堆尸体 的人 和 拖尸体的队伍 ,应该是独立的个体,是同时干活的,所以开两个线程

# 堆堆堆 。。。

class offerThread(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

offer(1)

# 拖拖拖 。。。

class mainThread(threading.Thread):

def __init__(self):

threading.Thread.__init__(self)

def run(self):

main()

6. 最后才是 发号命令 开始干活 。。。

#调用 主函数main

offthead = offerThread()

mthread = mainThread()

offthead.start()

mthread.start()

7. 最后的输出结果 情况 :

其实这个 列表对象也能实现队列 。。 。 不过需要自己实现队列阻塞能力,比较复杂,

当然这里并没有体现出阻塞的能力

初学者,如有问题,请不吝指出, 非常感谢  !!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值