多线程、计算机网络
多线程存钱:
import time
from threading import Thread , Lock
class Account(object):
def __init__(self):
self.__balance = 0
self.__lock = Lock()
@property
def balance(self):
return self.__balance
def deposit(self,money):
# 当多个线程同时访问一个资源的时候,就有可能因为竞争资源的状态导致错误
# 被多个线程访问的资源我们通常称之为临界资源 对资源的访问需要加上保护
if money > 0 :
self.__lock.acquire() # 获得锁
try:
new_balance = self.__balance + money
time.sleep(0.01)
self.__balance = new_balance
finally:
self.__lock.release() # 解锁
class AddMoneyThread(Thread) :
def __init__(self,account):
super().__init__()
self._account = account
def run(self):
self._account.deposit(1) # 加钱
def main():
account = Account() # 银行账号
tlist= []
for _ in range(100):
t = AddMoneyThread(account)
tlist.append(t)
t.start()
for t in tlist:
t.join()
print('账户余额:%d元'% account.balance)
if __name__ == '__main__':
main()
随机生成五个不同颜色的小方块(汽车)从起点跑到终点:
from pygame.threads import Thread
import time
class Color(object):
BLACK = (0,0,0)
WHITE = (255,255,255)
GTAY = (242,242,242)
@staticmethod # 随机颜色
def random_color():
r = randint(0,255)
g =randint(0,255)
b =randint(0,255)
return r,g,b
class Car(object):
def __init__(self,x,y,color): # 车的坐标颜色
self._x = x
self._y = y
self._color = color
def move(self):
if self._x + 80 < 950: # 车的终点线停止设置
self._x += randint(1,10) # 车的速度随机
def draw(self,screen):
pygame.draw.rect(screen,self._color,(self._x,self._y,80,40),0) # 画车大小
def main():
class BackgrondTask(Thread): # 线程
def run(self): # 每隔50毫秒车跑起来
while True:
screen.fill(Color.GTAY)
pygame.draw.line(screen, Color.BLACK, (130, 0), (130, 600), 4) # 起点线
pygame.draw.line(screen, Color.BLACK, (950, 0), (950, 600), 4) # 终点线
for car in cars:
car.draw(screen)
pygame.display.flip()
time.sleep(0.005)
for car in cars: # 车跑
car.move()
cars =[]
for index in range(5):
temp = Car(50,50+110*index,Color.random_color())
cars.append(temp)
pygame.init()
screen = pygame.display.set_mode((1000,600))
BackgrondTask(daemon = True).start() # 创建线程 daemon S是守护线程
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running= False
pygame.quit()
if __name__ == '__main__':
main()
自己做一个简单的服务器:
# 计算机网络:多台独立自主的计算机聚集到一起 共享资源通信数据交换
# HTTP - Hyper -Text Transfer Protocol
# SMTP - Simple Mall Transfer Protocol
# POP3 - Post Offce Protocol version 3
# IMAP - Internet Mail Access Protocol
#TeInet
#FTP
# TCP/IP
#
# cdm 输入ipconfig 可以查看ip地址 寻址
#
# cmd 命令窗口打开 netsat -na 命令窗口查看哪些端口被占用
#
# cmd 命令窗口打开 telnet 加上Ip 端口 连接服务器
from socket import socket ,AF_INET, SOCK_STREAM # 套接字
import datetime
def main():
# 创建一个基于TCP协议的套接字对象
# 因为我们做的是应用级的产品或服务所以可以利用现有的传输服务来实现数据传输
server = socket() # 创建一个套接字 # socket默认里面是(AF_INET,SOCK_STREAM) ## 这是类 AF_INET是系统固定参数
# 绑定IP地址(网络上主机的身份标识)和端口(用来区分不同服务的IP地址的扩展) 端口不是设备
server.bind(('10.7.189.53',6799)) # 绑定ip地址和网卡 端口号 端口号可以区分到底访问的是那个服务,端口号可以从0到65365 2的16次方减一个
# 尽量用1024以后的端口 127.0.0.1 或localhost 本地ip
# 10.7.189.53 自己电脑ip
# 开始监听客户端的连接
server.listen(512) # 限制服务器最大连接数量 512是经验值 很多服务器的数据2的9次方 所以512比较合适
print('服务器已经启动正在监听...')
while True:
# 通过accept方法接收客户端的连接
# accpet方法是一个阻塞式的方法 如果没有客户端练上来
# 那么accept 方法就会让代码柱塞 直到有客户端连接成功才返回
# accpet方法返回一个元组 元组中的第一个值是代表客户端的对象
# 元组中的第二个值又是一个元组 其中有客户端的IP地址和客户端的端口
client, addr = server.accept() ##连上来客户收到信息\
# print(client)
print(addr,'连接成功')
now_time = str(datetime.datetime.now())
# print(datetime.datetime.now())
client.send(now_time.encode('utf - 8')) #打印现在的时间给连接服务器的人
client.close()
if __name__ == '__main__':
main()
客户端:
from socket import socket
def main():
client = socket()
client.connect(('10.7.189.53',6750))
while True:
data = client.recv(1024) # 接收缓冲区 理论上越大越好 但是越大越占内存
print(data.decode('utf-8')) # decode二进制解码
talk = input('请输入聊天内容2:')
if data == 0 :
break
talk2 = client.send(talk.encode('utf - 8'))
if __name__ == '__main__':
main()
然后改善了一下可以服务器和客户端可以相互发消息:
## 两人做 可以相互聊天的 服务器
from socket import socket ,AF_INET, SOCK_STREAM # 套接字
def main():
server = socket()
server.bind(('10.7.189.53',6750))
server.listen(512)
print('Come on ! 我们来聊天吧!服务器已经启动正在监听...')
client,addr = server.accept()
print(addr,'连接成功')
while True:
talk = input('请输入聊天内容1:')
client.send(talk.encode('utf - 8'))
data = client.recv(1024)
print( data.decode('utf-8'))
client.close()
if __name__ == '__main__':
main()
from socket import socket
def main():
client = socket()
client.connect(('10.7.189.53',6750))
while True:
data = client.recv(1024) # 接收缓冲区 理论上越大越好 但是越大越占内存
print(data.decode('utf-8')) # decode二进制解码
talk = input('请输入聊天内容2:')
if data == 0 :
break
talk2 = client.send(talk.encode('utf - 8'))
if __name__ == '__main__':
main()