多进程
子进程创建默认导入父进程代码。子进程的模块名不是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 0
TFTP
格式要求:
读写请求:操作码(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确认包
MySQL
约束
非空约束
添加非空约束:(非空约束只能是列级约束)
alter table student modify name varchar(20) not null;
修改name字段类型为varchar(20),并添加非空约束。
删除非空约束
bash alter table student modify sex varchar(2);
修改sex字段类型为varchar(20),不写not null,即默认可为空。
默认值约束
只能用列级约束。
create table 表名(
字段名 字段类型 default value,
)
创建默认值约束代码:
mysql> create table student2(
-> id int,
-> name varchar(20),
-> sex varchar(1) default '男'
-> );
mysql> desc student2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int | YES | | NULL | |
| name | varchar(20) | YES | | NULL | |
| sex | varchar(1) | YES | | 男 | |
+-------+-------------+------+-----+---------+-------+
mysql> insert into student2 (id,name) values(3,'wang');
Query OK, 1 row affected (0.00 sec)
mysql> select * from student2;
+------+------+------+
| id | name | sex |
+------+------+------+
| 3 | wang | 男 |
+------+------+------+
1 row in set (0.00 sec)
自动增长约束
某个字段的值会自动增长
一个表中只有唯一字段。
一般配合主键使用,适用于整数int类型。
默认初始值为1,每增加一条记录,该字段值增加1。
外键约束
某表中某字段的值依赖于另一张表中某字段的值。
实现了数据库的参照完整性。
将两张表紧密结合,对某张表修改删除时,保持数据的完整性。
需使用表级约束添加。
create table 表名(
字段名 字段类型,
[constraint 外键约束名称] foreign key(字段名) references 表(字段名)
);
删除外键约束:
alter table 表名 drop foreign key 外键约束名;
索引
可分为普通索引、主键索引、非空索引、全文索引、空间索引、复合索引。