子进程创建默认导入父进程代码。子进程的模块名不是main。注意使用if __name__ == '__main__'语句。
多进程之间默认不共享变量,将公共变量复制,各自拥有各自的变量。
代码:
from multiprocessing import Process
num=0
def run1():
global num
num = num + 10
print('run1:',num)
def run2():
global num
num = num + 1
print('run2',num)
if __name__ =="__main__":
p1=Process(target=run1)
p1.start()
p1.join(10)
p2=Process(target=run2)
p2.start()
p2.join()
print('main',num)
结果:
run1: 10 run2 1 main 0TFTP
格式要求:
读写请求:操作码(1:下载/2:上传)【2bytes】,文件名【n bytes】,0【1 byte】,模式【n nytes】,0【1 byte】。
数据包:操作码(3)【2 bytes】,块编号【2 bytes】,数据【512 bytes】
ACK:操作码(4)【2 bytes】,块编号【2 bytes】
ERROR:操作码(5)【2 bytes】,差错码【2 bytes】,差错信息【n bytes】,0【1 byte】。
格式解析:
!:解析的固定开头
H:表示两个字节
b:表示一个字节
xxs:表示xx个字节,xx是数字
'''
使用tftpd64作为服务器。
下载大鸭鸭的图片
'''
import struct
from socket import *
filename = 'ruya.png'
server_ip='192.168.31.70'
send_data=struct.pack('!H{0}sb5sb'.format(len(filename)),1,filename.encode(),0,'octet'.encode(),0) #下载请求
s=socket(AF_INET,SOCK_DGRAM)
s.sendto(send_data,(server_ip,69)) #发送下载请求至服务器
f=open(filename,'ab')
while True:
recv_data = s.recvfrom(1024)#接收数据
#print(recv_data) #recv_data是【数据,(ip地址,算口号)元组】的格式,数据的前两位是操作码,
caozuoma,ack_num=struct.unpack('!HH',recv_data[0][:4])# 获取数据块编号
#print(recv_data[0][0:4]) #recv_datad 中传输的数据的前四个字节是操作码和块编号,
rand_port = recv_data[1][1]#获取服务器的随机端口
if int(caozuoma)==5:
print('文件不存在...')
break
print('操作码:{0},ACK:{1},服务器随机端口:{2},数据长度{3}'.format(caozuoma,ack_num,rand_port,len(recv_data[0][4:])))
f.write(recv_data[0][4:])
if len(recv_data[0])<516:
break
ack_data=struct.pack('!HH',4,ack_num)
s.sendto(ack_data,(server_ip,rand_port))#回复ack确认包



