Python:并发编程

Posted ZSYL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python:并发编程相关的知识,希望对你有一定的参考价值。

Python并发编程

代码编写完没有运行称之为程序,正在运行的代码就是进程。在Python3中,对多进程支持的是multiprocessing模块和subprocess模块。multiprocessing模块在子进程中运行任务、通讯和共享数据,以及执行各种形式的同步提供支持。

创建子进程

创建子进程 target接收执行的任务

  • p= Process(target=taskObj)

  • p.start() 调用子进程

  • 创建子进程 target接收执行的任务
    p = Process(target=run_test, args=(‘test’, 23), kwargs={‘key’: 12})
    args=元组 kwargs=字典

  • p.join() : 方法 主进程等待调用join子进程结束 :传参的是等待多久时间

  • 属性:p.pid p.name p.is_alive()

  • 多进程创建

  • 使用继承方式创建子进程

    • 更新初始化方法
    • 重写run方法

进程池

  • pool.apply_async(func, (msg,)) : 不阻塞进程池

  • pool.applyc(func, (msg,)) :阻塞进程池

  • 多个进程之间数据不共享,进程之间数据是独立的,默认情况下互不影响

队列

  • put():添加元素
  • get():获取并删除元素
  • qsize():队列的大小
  • block=True, timeout=1:判断是否堵塞,等待时间1s
  • full():判断队列是否已满

进程之间的通信

  • 通过队列进行通信

  • 创建不同的进程

  • 通过线程池创建进程

线程

线程也是实现多任务的一种方式,一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务就是线程,一个进程可以拥有多个并行的线程,其中每一线程,共享当前进程的资源

  • 线程的模块有 _thread threading
  • 函数调用sleep 函数休眠,会释放CPU的计算资源,这时另一个函数抢占CPU资源开始执行
  • start() 底层调用的是 run() 方法
  • 在一个进程内所有线程共享全局变量,多个线程之间的数据共享比多进程要好。但是可能造成多个进程同时修改一个变量(即线程非安全),可能造成混乱。

线程锁

  • 锁有两种状态–锁定和未锁定.某个线程要更改共享数据时,先将其锁定,此时资源的状态为‘锁定’,其他线程不能更改;直到该线程释放资源,将线程的资源状态变成‘非锁定’状态,其他线程才能再次锁定该资源。互斥锁保证了每次只有一个进程进行写操作,从而保证多线程情况下数据的正确性。
  • 使用Thread对象的 Lock 可以实现简单的线程同步,有上锁 acquire 方法 和 释放release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间

线程同步

同步就是协同步调,按预定的先后顺序进行运行。例如:开会。如进程、线程同步,可以理解为进程或线程A和B一块配合,A执行到一定程度要依靠B的某个结果,于是停下来,示意B运行,B运行后会将结果给A,A继续运行

  • ThreadLocal的使用:本身是一个全局变量,但是每个线程却可以利用它来保存属于自己的私有数据,这些私有数据对其他线程也是不可见的。

网络编程

IP地址与端口

  • IP地址
    用来标识网络中一个通信实体的地址。通信实体可以是计算机、路由器等。比如互联网的每个服务器都要有自己的IP地址,而每个局域网的计算机要通信也要配置IP地址。路由器是连接两个或多个网络的网络设备

  • A类 0网络号7位—主机号24位

  • B类 10网络号14位—主机号16位

  • C类 110网络号21位—主机号8位

  • D类 1110

  • E类 11110
    目前主流使用的IP地址是IPV4。IP地址实际是一个32位整数,实际是把32位整数按8位分组后的数字表示。

  • C类的主机号8位 2^8=255 所以表示0-255种,0、255不作为IP地址使用

IPv6 地址实际上是一个128位整数。
注意事项:

  • 127.0.0.1 本机地址
  • 192.168.0.0–192.168.255.255 为私有地址,属于非注册地址,专门为组织机构内部使用

端口

  • IP地址用来标识一台计算机,但是一台计算机可能提供多种网络应用程序,用端口区分不同的程序。
  • 端口是虚拟的概念,并不是说在主机上真有若干个端口。通过端口,可以在一个主机上运行多个网络应用程序。端口表示的是一个16位的二进制整数,对应十进制的0-65535
  • Oracle 3306,mysql 8080
  • 端口不要设置0-1023
  • IP地址好比每个人的地址(门牌号),端口好比是房间号。必须同时指定IP地址和端口号才能正确发送数据
  • IP地址好比电话号码,而端口号就好比为分机号

网络通信协议

计算机与计算机达成通信的协议
对速率、传输代码、代码结构、传输控制步骤、出错控制等指定标准。

  • 国际标准化组织(ISO,即 International Organization for Standardization)定义了网络通信的基本框架,被称为OSI(Open System Interconnect,即开放系统互联)模型.
  • OSI模型指定的七层标准模型,分别是:应用层,表示层,会话层,传输层,网络层,数据链路层,物理层。
  • TCP/IP是一个协议族,也是按照层次划分,共四层:应用层,传输层,互联网络层,网络接口层(物理+数据链路层)

TCP/UDP

TCP协议和UDP协议是传输层的两种协议。Socket是传输层供给应用层的编程接口,所以Socket编程就分为TCP编程和UDP编程

  • TCP方式类似打电话,使用这种方式进行网络通讯时,需要建立专门的虚拟连接,然后进行可靠的数据传输,如果数据发送失败,则客户端会自动重发该数据。UDP类似于发短信,不需要建立专门的虚拟连接,传输不是很可靠,如果发送失败客户端无法获得
  • TCP是面向连接的,传输数据安全,稳定,效率相对较低
  • UDP面向无连接的,传输数据不安全,效率较高

套接字编程

  • 使用UDP发送接收信息
# 导入模块
from socket import socket, AF_INET, SOCK_DGRAM
# 创建UDP套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)
# 绑定一个端口
udp_socket.bind(('', 8989)) 
# 绑定的是本机,端口是8989
# 创建接收信息的地址
addr = ('192.168.137.1', 8080)
# 键盘接收发送消息
data = input('请输入要发送信息:')
# 调用sendto方法发送信息, 编码'g2312',网络助手,随机给定端口udp_socket.sendto(data.encode('gb2312'), addr)
recv_data = udp_socket.recvfrom(1024) 
# 表示本次接收的最大字节数
print('接收到%s的消息是:%s'%(recv_data[1],recv_data[0].decode('gb2312')))
# 关闭套接字
udp_socket.close()

TFTP文件下载器

TFTP(Trivial File Transfer Protocol,简单文件传输协议) tftp端口号为 69

  • 读写请求: 操作码 1/2(RD/WR)(2Byte) --文件名(n Bytes String) – 0 (1B)–模式(nBytesString)–0(1B)
  • 数据包:操作码 3(DATA)–块编号(2Byte)–数据(512BytesData)
  • ACK 操作码(4ACK) – 块编号(2Byte)
  • ERROR 操作码 (5ERR) 差错码(2 Bytes) – 差错信息(n Bytes) --0(1B)
  • 当客户端收到的数据小于516(2字节操作码+2字节的序号+512字节数据)时,就意味着服务器发送完毕了(如果恰好最后一次数据长度为516,会再发送一个长度为0的数据包)

以上是关于Python:并发编程的主要内容,如果未能解决你的问题,请参考以下文章

golang代码片段(摘抄)

《java并发编程实战》

python中的多线程和多进程编程

Java并发编程实战 04死锁了怎么办?

Java并发编程实战 04死锁了怎么办?

Python:并发编程