并发: 在一段时间内交替去执行任务。
并行:
对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。这里需要注意多核cpu是并行的执行多任务,始终有多个软件一起执行。
在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式
一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。
注意:
一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。
#导包
import multiprocessing
Process创建的实例对象的常用方法:
Process创建的实例对象的常用属性:
name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
# 导入多进程模块
import multiprocessing
import os
def login(name,password):
print('名字:',name)
print('密码:', password)
print('登录')
# 获取当前进程名称
print('进程名称:',multiprocessing.current_process().name)
# 获取当前进程编号
print('子进程:', os.getpid())
# 获取主进程编号
print('子进程的父进程编号:', os.getppid())
if __name__== '__main__':
# login()
# login()
# 使用多进程的形式完成多次调用
# group=None 指定分组,默认为None,
# target=None 指定要调用的函数名,
# name=None 指定进程名称,
# args=(), kwargs={}给函数传递参数,
# daemon=None 指定守护进程
# 创建了一个进程
# 注意不能用小写process方法
print(chr(100))
p1 = multiprocessing.Process(target=login,args=('python',11111111),name='p1')
p2 = multiprocessing.Process(target=login,kwargs={'name':'itcast','password':22222222},name='p2')
p3 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')
# 运行进程指定对应函数业务逻辑
# 如果需要进程同步按照循序执行,需要用到进程等待join方法
p1.start()
# 等待进程p1执行完成后在执行其他的进程
p1.join()
p2.start()
p2.join()
p3.start()
p3.join()
# 获取当前进程编号
print('主进程:',os.getpid())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8J3uFUuu-1663039134442)(C:\Users\liuyikang\AppData\Roaming\Typora\typora-user-images\image-20220911113113635.png)]
线程是进程中执行代码的一个分支,每个执行分支(线程)要想工作执行代码需要cpu进行调度,也就是说线程是cpu调度的基本单位,每个进程至少都有一个线程,而这个线程就是我们通常说的主线程。
Thread([group [, target [, name [, args [, kwargs]]]]])
#导入线程模块
import threading
导入线程模块
import threading
def func(data):
print(‘线程使用’)
print(f’参数数据:{data}')
# 获取当前执行线程的名称
print(‘线程名称:’,threading.current_thread().name)
if name == ‘main’:
# 创建线程
# group = None, 使用默认
# target = None, 指定函数方法
# name = None, 指定线程名称
# args = (), kwargs = None, 传递参数
# daemon = None 设置守护线程
t1 = threading.Thread(target=func,args=('python',),name='t1')
t2 = threading.Thread(target=func,kwargs={'data':'itcast'},name='t2')
# 启动运行线程
t1.start()
t2.start()
进程优缺点:
优点:可以用多核
缺点:资源开销大
线程优缺点:
优点:资源开销小
缺点:不能使用多核
面向连接
通信双方必须先建立好连接才能进行数据的传输,数据传输完成后,双方必须断开此连接,以释放系统资源。
可靠传输
TCP 采用发送应答机制
超时重传
错误校验
流量控制和阻塞管理
TCP 是一个稳定、可靠的传输协议,常用于对数据进行准确无误的传输,比如: 文件下载,浏览器上网。
socket (简称 套接字) 是进程之间通信一个工具,好比现实生活中的插座,所有的家用电器要想工作都是基于插座进行,进程之间想要进行网络通信需要基于这个 socket。
socket的作用
负责进程之间的网络数据传输,好比数据的搬运工。
进程之间网络数据的传输可以通过 socket 来完成, socket 就是进程间网络数据通信的工具。
客户端开发介绍:
1.创建客户端套接字对象
2.和服务端套接字建立连接
3.发送数据
4.接收数据
5.关闭客户端套接字
服务端开发流程介绍:
1.创建服务端端套接字对象
2.绑定端口号
3.设置监听
4.等待接受客户端的连接请求
5.接收数据
6.发送数据
7.关闭套接字
1.当 TCP 客户端程序想要和 TCP 服务端程序进行通信的时候必须要先建立连接
2.TCP 客户端程序一般不需要绑定端口号,因为客户端是主动发起建立连接的。
3.TCP 服务端程序必须绑定端口号,否则客户端找不到这个 TCP 服务端程序。
4.listen 后的套接字是被动套接字,只负责接收新的客户端的连接请求,不能收发消息。
5.当 TCP 客户端程序和 TCP 服务端程序连接成功后, TCP 服务器端程序会产生一个新的套接字,收发客户端消息使用该套接字。
6.关闭 accept 返回的套接字意味着和这个客户端已经通信完毕。
7.关闭 listen 后的套接字意味着服务端的套接字关闭了,会导致新的客户端不能连接服务端,但是之前已经接成功的客户端还能正常通信。
8.当客户端的套接字调用 close 后,服务器端的 recv 会解阻塞,返回的数据长度为0,服务端可以通过返回数据的长度来判断客户端是否已 经下线,反之服务端关闭套接字,客户端的 recv 也会解阻塞,返回的数据长度也为0。