复习:ThreadLocal
将局部变量绑定到当前线程中
1.使用函数传参的方法
defprocess_student(name):
std = Student(name)
# std是局部变量,但是每个函数都要用它,因此必须传进去:
do_task_1(std)
do_task_2(std)
defdo_task_1(std):
do_subtask_1(std)
do_subtask_2(std)
defdo_task_2(std):
do_subtask_2(std)
do_subtask_2(std)
2、使用全局字典的方法
lobal_dict = {}
defstd_thread(name):
std = Student(name)
#把std放到全局变量global_dict中:
global_dict[threading.current_thread()] = std
do_task_1()
do_task_2()
defdo_task_1():
#不传入std,而是根据当前线程查找:
std = global_dict[threading.current_thread()]
...
defdo_task_2():
#任何函数都可以查找出当前线程的std变量:
std = global_dict[threading.current_thread()]
...
3、使用ThreadLocal的方法
importthreading
#创建全局ThreadLocal对象:
local_school = threading.local()
defprocess_student():
#获取当前线程关联的student:
std = local_school.student
print('Hello, %s (in %s)'% (std, threading.current_thread().name))
defprocess_thread(name):
#绑定ThreadLocal的student:
local_school.student = name
process_student()
t1 = threading.Thread(target= process_thread, args=('yongGe',), name='Thread-A')
t2 = threading.Thread(target= process_thread, args=('老王',), name='Thread-B')
t1.start()
t2.start()
t1.join()
t2.join()
4、异步
frommultiprocessingimportPool
importtime
importos
deftest():
print("---进程池中的进程---pid=%d,ppid=%d--"%(os.getpid(),os.getppid()))
foriinrange(3):
print("----%d---"%i)
time.sleep(1)
return"hahah"
deftest2(args):
print("---callback func--pid=%d"%os.getpid())
print("---callback func--args=%s"%args)
pool = Pool(3)
pool.apply_async(func=test,callback=test2)
time.sleep(5)
print("----主进程-pid=%d----"%os.getpid())
网络编程
TCP/IP协议(族)
网际层也称为:网络层
网络接口层也称为:链路层
1.什么是端口
端口就好一个房子的门,是出入这间房子的必经之路。
端口号
端口是通过端口号来标记的,端口号只有整数,范围是从0到65535
知名端口(Well Known Ports)
知名端口是众所周知的端口号,范围从0到1023
80端口分配给HTTP服务
21端口分配给FTP服务
一般情况下,如果一个程序需要使用知名端口的需要有root权限
动态端口(Dynamic Ports)
动态端口的范围是从1024到65535
之所以称为动态端口,是因为它一般不固定分配某种服务,而是动态分配。
动态分配是指当一个系统进程或应用程序进程需要网络通信时,它向主机申请一个端口,主机从可用的端口号中分配一个供它使用。
当这个进程关闭时,同时也就释放了所占用的端口号。
怎样查看端口 ?
用“netstat-ano” “ps -aux”查看端口状态
ip地址的分类
每一个IP地址包括两部分:网络地址和主机地址
私有ip
在这么多网络IP中,国际规定有一部分IP地址是用于我们的局域网使用,也就
是属于私网IP,不在公网中使用的,它们的范围是:
10.0.0.0~10.255.255.255
172.16.0.0~172.31.255.255
192.168.0.0~192.168.255.255
1.1.1子网掩码
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分子网掩码的设定必须遵循一定的规则。
与IP地址相同,子网掩码的长度也是32位,
1.1.2socket简介
1.本地的进程间通信(IPC)有很多种方式,例如
·队列
·同步(互斥锁、条件变量等)
什么是socket
socket(简称套接字)是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:
它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于Socket来完成通信的
创建socket
socket.socket(AddressFamily, Type)
importsocket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print'Socket Created'
创建一个udp socket(udp套接字)
importsocket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
print'Socket Created'
1.1.1UDP介绍
UDP ---用户数据报协议,是一个无连接的简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。
UDP是一种面向无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的。
UDP特点:
UDP是面向无连接的通讯协议,UDP数据包括目的端口号和源端口号信息,由于通讯不需要连接,所以可以实现广播发送。UDP传输数据时有大小限制,每个被传输的数据报必须限定在64KB之内。UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
udp网络程序-发送数据
socket函数
mySocket = socket(family, type)
函数socket()的参数family用于设置网络通信的域,函数socket()根据这个参数选择通信协议的族。通信协议族在文件sys/socket.h中定义。
代码如下:
from socket import *
#1.创建套接字
udpSocket = socket(AF_INET, SOCK_DGRAM)
#2.准备接收方的地址
sendAddr = ('192.168.11.74', 7788)
#3.从键盘获取数据
sendData = input("请输入要发送的数据:")
#4.发送数据到指定的电脑上
udpSocket.sendto(sendData.encode('gbk'), sendAddr)
#5.关闭套接字
udpSocket.close()
udp发:
from socket import *
#创建对象
socket_udp = socket(type=SOCK_DGRAM)
#发送方绑定端口号和IP,如果不绑定,随机设置端口号
#address1 = ('192.168.12.2',12345)
#socket_udp.bind(address1)
#接收方的地址和端口号
address2=('192.168.12.2',5678)
#输入内容
content = input('>')
#发送
socket_udp.sendto(content.encode('gbk'),address2)
#关闭
socket_udp.close()
print('哦了。。。。。。')
;