Python的多线程(二)

坚强是说给别人听的谎言 提交于 2019-11-26 14:04:17

Python的多线程

1、多任务的概念

1.1 单任务

一个一个完成任务

1.2 多任务

同一时间内执行多个任务

1.3 并发和并行

1.3.1 并行

一起执行

1.3.2 并发

任务的交替进行

2、进程、线程与协程

2.1 进程

进程:是系统进行资源分配的基本单位。

进程:动态的概念,运行起来的程序,包括程序,以及运行程序所需要的计算机资源等。

程序:静态的概念,我们写的.py或.go等,都是程序。

2.1.1 进程状态

3、网络通信概述

3.1网络的定义

网络:辅助双方或者多方能够连接一起的工具,用来进行数据交换

协议:一种约定俗成的规定

TCP/IP协议:计算机遵守的网络通信协议

3.2 端口

端口:个数是2的16次方(0-65535)端口编号

端口是数据发出和接收的入口

端口的目的:通过端口号找到对应的进程,完成数据的通信。

著名端口(0-1023)不允许使用除了这些之外都能使用

动态端口(1024-65535)可以使用

3.3 IP

IP地址:标记网络中唯一的一台设备的一串数字,例如192.168.1.1 在本地局域网是唯一的

注意:127.0.0.1 代表的是本机的IP地址

4、socket()

简称:套接字,是进程之间进行通信的一种方式

实现了不同主机之间的进程通信,我们现在使用的大多数的服务:qq、网络浏览等都是基于socket()完成通信的

4.1 python中的socket

    def __init__(self, family=-1, type=-1, proto=-1, fileno=None):
        # For user code address family and type values are IntEnum members, but
        # for the underlying _socket.socket they're just integers. The
        # constructor of _socket.socket converts the given argument to an
        # integer automatically.
        if fileno is None:
            if family == -1:
                family = AF_INET
            if type == -1:
                type = SOCK_STREAM
            if proto == -1:
                proto = 0
        _socket.socket.__init__(self, family, type, proto, fileno)
        self._io_refs = 0
        self._closed = False
注意点: 
1、family = AF_INET 表示的用于Internet之间的通信
2、type = SOCK_STREAM是指流式套接字,用于tcp协议
3、type = SOCK_DGRAM数据报套接字,用于UDP协议

4.2 udp发送数据

sendto()
注意点:
1、sendto()这个方法发送的数据,是bytes类型,普通字符串用encode()转成bytes类型
2、address是用来指定对方的IP地址和端口
发送的数据需要处理成字节流文件,windows使用的是gbk,

4.3 udp接收数据

recvfrom()
注意点:
1、recvfrom()它有返回值,返回(数据,发送该条信息的地址)
2、这个数据接收过来是bytes类型,需要用decode()转换成普通的字符串

4.4 bind()端口

socket_udp_client.bind(('',8080))
如果不写则代表本机所有的ip地址

5、UDP协议

5.1 特点

面向无连接的通讯协议

5.2 UDP服务端的通信流程

1、创建一个socker套接字

2、绑定端口

3、接收服务端传递过来的请求

4、处理请求,发送数据给客户端

5、关闭套接字

服务器一般情况下都不会关闭套接字

5.3 客户端通信流程

1、创建套接字

2、发送请求(数据)

3、接收数据

4、关闭套接字

7、tcp协议

7.1 基于tcp协议的客户端

1、创建套接字

2、与服务端创建连接

3、发送数据

4、接收数据

5、关闭套接字

7.2 基于tcp协议的服务端

1、创建socket套接字

2、需要使用bind来绑定服务端ip和端口

3、listen监听模式,使得服务端的套接字从主动状态变成被动状态,等待接收用户的连接

4、accept处理用户链接(等待客户端链接),运行之后是阻塞状态,知道有客户连接

5、通过新创建的套接字进行数据的收发工作

6、接收数据

7、发送数据

8、关闭套接字

7.3 三次握手

tcp是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接:

位码即tcp标志位,有6种标示:

SYN(synchronous建立联机)

ACK(acknowledgement 确认)

PSH(push传送)

FIN(finish结束)

RST(reset重置)

URG(urgent紧急)

Sequence number(顺序号码) Acknowledge number(确认号码)

第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

完成三次握手,主机A与主机B开始传送数据。

7.4 四次握手

(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送(报文段4)。

(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1(报文段5)。和SYN一样,一个FIN将占用一个序号。

(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A(报文段6)。

(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1(报文段7)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!