#encoding=utf-8 from threading import Thread from time import sleep class Account: def __init__(self,money,name): self.money=money self.name=name #模拟提款操作 class Drawing(Thread): def __init__(self,drawingNum,account): Thread.__init__(self) self.drawingNum=drawingNum self.account=account self.expenseTotal=0 def run(self): lock.acquire() if self.account.money-self.drawingNum<0: return sleep(1) sleep.account.money-=self.drawingNum self.expenseTotal+=self.drawingNum lock.release() print(f"账户:{self.account.name},余额是:{self.account.money}") print(f"账户:{self.account.name},余额是:{self.expenseTotal}") if __name__=="__main__": a1=Account("小高",100) lock=Lock() draw1=Drawing(80,a1) #定义取钱线程对象 draw2=Drawing(80,a1) draw1.start() #你取钱 draw2.start() #另一个人取钱#
老师,我这个没有Lock()报错是怎么回事呀,好多次都是太远了
#encoding=utf-8 from threading import Thread from time import sleep def func1(name): for i in range(4): print(f"线程:{name}:{i}") sleep(1) #每打一个暂停一下 if __name__=="__main__": print("主线程,start") #创建线程 t1=Thread(target=func1,args=("t1,")) t2=Thread(target=func1,args=("t2,")) #启动线程 t1.start() t2.start() print("主线程,end")
老师,为什么我这个报错了呀,还有为啥第6行要加f啊?
为什么我的守护线程没有实现效果
import time from threading import Thread #通过类包装 class MyThread(Thread): def __init__(self,name): Thread.__init__(self) self.name = name def run(self): print(f'{self.name},start') for i in range(3): print(f'{self.name}线程:{i}') time.sleep(3) print(f'{self.name}线程,end') if __name__ == '__main__': print('主线程start') t1 = MyThread('t1') t2 = MyThread('t2') t1.daemon =True t1.start() t2.start() #等t1,t2线程结束才会继续执行主线程 print('主线程end')
我的主线程都已经结束了,为什么t1还是会继续执行???
前面这个‘f’什么作用?
import threading #用方法包装 def fun1(): print('f线程,start') for i in range(3): print('线程:{i}') print('f线程,end') #创建线程,使用threading方法 t1 = threading.Thread(target=fun1,args=('t1',)) t2 = threading.Thread(target=fun1,args=('t2',)) if __name__ == '__main__': print('主线程,start') t1.start() t2.start() print('主线程,end') 老师这个是什么原因报错的
#coding=utf-8 from threading import Thread from time import sleep def func1(name): print(f"线程{name},start") for i in range(3): print(f"线程:{name},{i}") sleep(5) 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")
老师 这个是怎么回事呢
# 服务器端:一个线程专门发送消息,一个线程专门接收消息。 # 客户端:一个线程专门发送消息,一个线程专门接收消息。 # 结合多线程实现TCP双向传送(自由聊天) # 【示例】TCP服务端结合多线程实现自由收发信息 from socket import * from threading import Thread def recv_data(): while True: # 读取客户端的消息 re_data = tcp_client_socket.recv(1024) re_content =re_data.decode('gbk') # 将消息输出到控制台 print(f"客户端说:{re_content},from:{host}") if re_content == '88': break # 获取控制台信息 def send_data(): while True: msg = input(">") tcp_client_socket.send(msg.encode("gbk")) if __name__ == '__main__': tcp_server_socket = socket(AF_INET, SOCK_STREAM) tcp_server_socket.bind(('127.0.0.1', 8888)) tcp_server_socket.listen() print("服务端已经启动,等待客户端连接!") tcp_client_socket, host = tcp_server_socket.accept() print("一个客户端建立连接成功!") t1 = Thread(target=recv_data()) t2 = Thread(target=send_data()) t1.start() t2.start() t1.join() t2.join() tcp_client_socket.close() tcp_server_socket.close() from socket import * from threading import Thread def recv_data(): while True: redata=tcp_client_socket.recv(1024) recv_data=redata.decode('gbk') print(f"服务器端说:{recv_data}") def send_data(): while True: msg=input(">") tcp_client_socket.send(msg.encode("gbk")) if msg == '88': break if __name__ == '__main__': tcp_client_socket=socket(AF_INET,SOCK_STREAM) tcp_client_socket.connect(('127.0.0.1',8888)) print("连接建立成功") t1=Thread(target=recv_data()) t2=Thread(target=send_data()) t1.start() t2.start() t1.join() t2.join() tcp_client_socket.close() 这个持续通信中的发送消息接收信息判断为什么不生效,当输入88的时候
#coding=utf-8 '''双向通信Socket之客户端 将控制台输入的信息发送给服务器端 读取服务器端的数据,将内容输出到控制台''' from socket import * tcp_client_socket=socket(AF_INET,SOCK_STREAM) tcp_client_socket.connect(('127.0.0.1',8888)) while True: msg=input(">") tcp_client_socket.send(msg.encode("gbk")) if msg=='end': break redata=tcp_client_socket.recv(1024) recv_data=redata.decode('gbk') print(f"服务器端说:{recv_data}") tcp_client_socket.close() # TCP双向持续通信 # 【示例】TCP:双向通信Socket之服务器端 #coding=utf-8 from socket import * tcp_server_socket=socket(AF_INET,SOCK_STREAM) tcp_server_socket.bind(('127.0.0.1',8888)) tcp_server_socket.listen(5) print("服务端已经启动,等待客户端连接!") tcp_client_socket,host=tcp_server_socket.accept() print("一个客户端建立连接成功!") while True: re_data = tcp_server_socket.recv(1024) re_content =re_data.decode('gbk') print(f"客户端说:{re_content},from:{host}") if re_content == 'end': break msg = input(">") tcp_server_socket.send(msg.encode("gbk")) tcp_client_socket.close() tcp_server_socket.close() 客户端运行输入报错 >121 Traceback (most recent call last): File "C:/Users/Administrator/Desktop/python代码练习/udp.py", line 68, in <module> redata=tcp_client_socket.recv(1024) ConnectionAbortedError: [WinError 10053] 你的主机中的软件中止了一个已建立的连接。 这个是为什么啊
'''【示例】UDP接收数据''' #coding=utf-8 from socket import * s=socket(AF_INET,SOCK_DGRAM)#创建套接字 s.bind(("127.0.0.1",8888)) print("等待接收数据!") redata =s.recvfrom(1024)#1024表示本次接收的最⼤字节数,s.recvfrom() '''接收UDP数据,与recv()类似,但返回值是 (data,address)。其中data是包含接收数据的字符 串,address是发送数据的套接字地址。''' print(f"收到远程消息:{redata[0]},from {redata[1]}") s.close() 运行结果
请输入:付水电费第三方第三方
print为什么一直打印不了
#encoding=utf-8 from time import sleep from queue import Queue from threading import Thread def producer(): num=1 while True: if queue.qsize()<3: print(f"生产{num}号大馒头") queue.put(f"将{num}号馒头放进框中") num+=1 else: print("馒头框满了,等待来人消费啊!") sleep(1) def consumer(): while True: print(f"获取{queue.get()}") sleep(1) if __name__ == '__main__': queue=Queue() t=Thread(target=producer) t.start() c=Thread(target=consumer) c.start()
老师,这里的queue.get()返回的是什么内容啊,是queue.put()中的字符串么?
#未使用线程同步和互斥锁的情况 from threading import Thread from time import sleep class Account: def __init__(self,money,name): self.money=money self.name=name #模拟提款的操作 class Drawing(Thread):#继承Thread类 def __init__(self,drawingNum,account): Thread.__init__(self)#包含调用父类构造函数 self.drawingNum=drawingNum self.account=account self.expenseTotal=0 def run(self): if self.account.money < self.drawingNum: return #结束函数 sleep(1)#判断完可以取钱,则阻塞,就是为了测试发生冲突问题 self.account.money-=self.drawingNum self.expenseTotal+=self.drawingNum print(f"账户:{self.account.name},余额是:{self.account.money}") print(f"账户:{self.account.name},总共取了:{self.expenseTotal}") if __name__ == '__main__': a1=Account(100,"gaoqi")#实例化对象 draw1=Drawing(80,a1)#实例化对象,并将a1作为参数传入 draw2=Drawing(80,a1) draw1.start() draw2.start()
老师,这里最终为什么总共不是取了160?draw1和draw2传入的第二个参数是同一个对象a1,是不是因为执行draw2线程时又把self.expenseTotal=0重定义了,所以还是一共取了80?
老师,这是什么原因呢?
一脸懵逼,讲一大堆理论
老师我怎么感觉我的VScode怪怪的要全选才可以把代码运行,直接运行就报错
为什安装有greenlet 但是无法调用咧
非常抱歉给您带来不好的体验!为了更深入的了解您的学习情况以及遇到的问题,您可以直接拨打投诉热线:
我们将在第一时间处理好您的问题!
关于
课程分类
百战程序员微信公众号
百战程序员微信小程序
©2014-2025百战汇智(北京)科技有限公司 All Rights Reserved 北京亦庄经济开发区科创十四街 赛蒂国际工业园网站维护:百战汇智(北京)科技有限公司 京公网安备 11011402011233号 京ICP备18060230号-3 营业执照 经营许可证:京B2-20212637