一、代码
#coding=utf-8 import threading import time from queue import Queue class Pro(threading.Thread): def run(self): global q count=0 while True: if q.qsize()<100: for i in range(10): count = count+1 msg = "生成产品"+str(count) q.put(msg) print(msg) time.sleep(1) class Con(threading.Thread): def run(self): global q while True: if q.qsize()>10: for i in range(3): msg = self.name + "消费了" + q.get() print(msg) time.sleep(1) if __name__ == "__main__": q = Queue() for i in range(50): q.put("初始产品"+str(i)) print("初始产品"+str(i)) for i in range(2): p = Pro() p.start() for i in range(5): c = Con() c.start()
二、运行结果
生成产品1
生成产品2
生成产品3
生成产品4
生成产品5
生成产品6
生成产品7
生成产品8
生成产品9
生成产品10
Thread-3消费了初始产品0
Thread-3消费了初始产品1
Thread-3消费了初始产品2
Thread-4消费了初始产品3
Thread-4消费了初始产品4
Thread-4消费了初始产品5
Thread-5消费了初始产品6
Thread-5消费了初始产品7
Thread-5消费了初始产品8
Thread-6消费了初始产品9
Thread-6消费了初始产品10
Thread-6消费了初始产品11
Thread-7消费了初始产品12
Thread-7消费了初始产品13
Thread-7消费了初始产品14
Thread-4消费了初始产品15
Thread-4消费了初始产品16
Thread-4消费了初始产品17
生成产品11
生成产品12
生成产品13
生成产品14
生成产品15
生成产品16
Thread-3消费了初始产品18
Thread-3消费了初始产品19
Thread-3消费了初始产品20
生成产品17
生成产品18
生成产品19
生成产品20
Thread-7消费了初始产品21
Thread-6消费了初始产品22
Thread-6消费了初始产品23
Thread-6消费了初始产品24
Thread-7消费了初始产品25
Thread-7消费了初始产品26
Thread-5消费了初始产品27
Thread-5消费了初始产品28
Thread-5消费了初始产品29
Thread-4消费了初始产品30
Thread-4消费了初始产品31
Thread-4消费了初始产品32
Thread-3消费了初始产品33
Thread-3消费了初始产品34
Thread-3消费了初始产品35
Thread-5消费了初始产品36
Thread-5消费了初始产品37
Thread-5消费了初始产品38
Thread-6消费了初始产品39
Thread-6消费了初始产品40
Thread-6消费了初始产品41
生成产品21
生成产品22
生成产品23
生成产品24
生成产品25
生成产品26
生成产品27
生成产品28
Thread-7消费了初始产品42
Thread-7消费了初始产品43
Thread-7消费了初始产品44
生成产品29
生成产品30
三、问题
上述程序创造了2个产生数据的线程p1、p2,和五个输出数据的线程c1/2/3/4/5,产生数据的线程是一个循环,产生10个数据,消费数据的线程是输出3个线程,我知道线程之间是交替执行的,但是从结果中看出,一个线程的循环都没有结束都跳去了另一个线程里呢,而且还没有规律,请问老师这样是为什么?线程交替运行这么不可控,他存在的意思是啥,都不能用来计算?
Process.__init__(self)
老师你好!这个是不是可以这样理解呢,老师(如下)
class Process(): def __init__(self):
谢谢老师!
#coding=utf-8 from threading import Thread from time import sleep def func1(name): print(f"线程{name},start")#format for i in range(3): print(f"线程: {name},{i}") sleep(3) print(f"线程{name},end") if __name__ == '__main__': print("主线程,start") #创建线程 t1 = Thread(target=func1,args=("t1")) t2 = Thread(target=func1,args=("t2")) #启动线程 t1.start() t2.start() print("主线程,end")
老师为什么我这个运行不了
代码如下:
multiprocessing ProcessQueue time sleep MyProcess(Process): (namemq): Process.() .name = name .mq = mq (): (.name) (.mq.get()) sleep() (.name) __name__ == : mq = Queue() mq.put() mq.put() mq.put() p_list=[] i (): p = MyProcess(imq) p_list.append(p) p p_list: p.start()
老师,请问图中的变量recv_data[0]前面的3和1各占两个字节,不应该是从第5位开始才是图片的数据吗?即[5:];还是说在这里遵循不包头包尾呀?
老师这个是哪里有问题,也不报错,也不显示结果
1 def func1(): 2 for i in range(11): 3 print(f'北京打印第{i}次数据') 4 yield 5 6 7 def func2(): 8 g = func1() 9 next(g) 10 for i in range(10): 11 print(f'上海打印第{i}次数据') 12 next(g) 13 14 15if __name__ == '__main__': 16 func2()
老师,第一次运行时这里的第12行next(g)中的g是‘第0次’还是‘第1次’
运行不出来,不知哪里出现了问题
老师,假如信号量是2,是不是只要其中的一个线程释放资源,下一个线程就可立马抢占资源 ,而不用等到两个线程同时释放资源,后面两个才会开始调用acquire?
from multiprocessing import Pool import os from time import sleep def func1(name): print("当前进程的ID:{0},名称{1}".format(os.getpid(),name)) if __name__ == '__main__': with Pool(5) as pool: pool.map(func1,('hangzhou','xihu','wulin','daguan','hemu','guashan','xintang',))
使用pycharm,执行结果所有进程是同一个ID,这个是什么原因?
老师,这个安装greenlet模块路径出错了怎么解决呀
请问这个报错是为什么?这几节课都出现了这个问题
#coding=utf-8 from socket import * s = socket(AF_INET, SOCK_DGRAM) #创建套接字 #绑定接收信息端口 s.bind(('127.0.0.1', 8888)) #绑定一个端口,ip地址和端⼝号 print("等待接收数据!") redata = s.recvfrom(1024) #1024表示本次接收的最⼤字节数 print(redata) print(f'收到远程信息:{redata[0].decode("gbk")}, from {redata[1]}') s.close()
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637