python基础-Process创建进程、join方法、实现ftp多进程

2024-08-31 22:38

本文主要是介绍python基础-Process创建进程、join方法、实现ftp多进程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

      • 进程概念
      • 获取进程id
      • 并行并发概念
      • Process类的介绍
      • Process类的其他方法
      • join方法
      • 利用多进程实现ftp套接字

进程概念

进程即正在执行的一个过程或者说一个任务。进程是对正在运行程序的一个抽象,而负责执行任务则是cpu
程序仅仅只是一堆代码而已,而进程指的是程序的运行过程。
进程的概念起源于操作系统,进程的创建,调度管理都归操作系统管

一 操作系统的作用:
1:隐藏丑陋复杂的硬件接口,提供良好的抽象接口
2:管理、调度进程,并且将多个进程对硬件的竞争变得有序

二 多道技术:
1.产生背景:针对单核,实现并发
ps:
现在的主机一般是多核,那么每个核都会利用多道技术
有4个cpu,运行于cpu1的某个程序遇到io阻塞,会等到io结束再重新调度,会被调度到4个
cpu中的任意一个,具体由操作系统调度算法决定。

2.空间上的复用:如内存中同时有多道程序
3.时间上的复用:复用一个cpu的时间片强调:遇到io切,占用cpu时间过长也切,核心在于切之前将进程的状态保存下来,这样才能保证下次切换回来时,能基于上次切走的位置继续运行

获取进程id

getpid是获得当前进程的进程号
getppid是获得当前进程的父进程的进程号

import time,os
print(os.getpid(),os.getppid())
time.sleep(1000)

输出如下:

1512 12032

这里写图片描述

并行、并发概念

一 并发:单个cpu+多道技术就可以实现并发,(并行也属于并发)
二 并行:同时运行,只有具备多个cpu才能实现并行
有四个核,六个任务,这样同一时间有四个任务被执行,假设分别被分配给了cpu1,cpu2,cpu3,cpu4,一旦任务1遇到I/O就被迫中断执行,此时任务5就拿到cpu1的时间片去执行,而一旦任务1的I/O结束了,操作系统会重新调用它(需知进程的调度、分配给哪个cpu运行,由操作系统说了算),可能被分配给四个cpu中的任意一个去执行

Process类的介绍

p.start() #只是在给操作系统发了一个信号,让操作系统去开进程(申请内存+拷贝父进程的地址空间)

方式一:


from multiprocessing import Process
import timedef task(name):print('%s is running' %name)time.sleep(2)if __name__ == '__main__': #在windows系统下,开子进程的代码必须写到这一行下面p=Process(target=task,args=('safly1',))p.start() #只是在给操作系统发了一个信号,让操作系统去开进程(申请内存+拷贝父进程的地址空间)p1 = Process(target=task, kwargs={"name":"safly2"})p1.start()print('主')

输出如下:

主
safly1 is running
safly2 is running

方式二:


from multiprocessing import Process
import timeclass Myprocess(Process):def __init__(self,name):super().__init__()self.name=namedef run(self):time.sleep(3)print('%s is running' % self.name)if __name__ == '__main__':  # 在windows系统下,开子进程的代码必须写到这一行下面p = Myprocess('safly')p.start()  # p.run()print('主')

输出如下:

主
safly is running

Process类的其他方法

from multiprocessing import Process
import time, random
def task():print('孙子运行了')time.sleep(3)def piao(name):print('%s is piaoing' % name)time.sleep(random.randint(1, 3))print('%s is done' % name)p=Process(target=task,)p.start()if __name__ == '__main__':p1=Process(target=piao,args=('alex',),name='xxxxxxxx')p1.start()print(p1.name)print(p1.pid)print(p1.is_alive())print('主')

输出如下:

E:\python\python_sdk\python.exe E:/python/py_pro/3_Process对象的属性与方法.py
xxxxxxxx
11816
True
主
alex is piaoing
alex is done
孙子运行了Process finished with exit code 0

join方法

join:主进程等,等待子进程结束

from multiprocessing import Process
import time,randomdef piao(name):print('%s is piaoing' %name)time.sleep(random.randint(1,3))print('%s is done' %name)if __name__ == '__main__':p1=Process(target=piao,args=('alex',))p2=Process(target=piao,args=('wxx',))p3=Process(target=piao,args=('yxx',))p1.start()p2.start()p3.start()p3.join()  # join(p)p1.join() #join(p)p2.join() #join(p)print('主')

输出如下:

alex is piaoing
wxx is piaoing
yxx is piaoing
alex is done
wxx is done
yxx is done
主

进程只要start就会在开始运行了,所以p1-p3.start()时,系统中已经有3个并发的进程了
而我们p1.join()是在等p1结束,没错p1只要不结束主线程就会一直卡在原地,这也是问题的关键
join是让主线程等,而p1-p3仍然是并发执行的,p1.join的时候,其余p2,p3仍然在运行,等#p1.join结束,可能p2,p3早已经结束了,这样p2.join,p3.join直接通过检测,无需等待
所以3个join花费的总时间仍然是耗费时间最长的那个进程运行的时间
上述例子可以简写成如下:

from multiprocessing import Process
import time,randomdef piao(name):print('%s is piaoing' %name)time.sleep(random.randint(1,3))print('%s is done' %name)if __name__ == '__main__':p1=Process(target=piao,args=('alex',))p2=Process(target=piao,args=('wxx',))p3=Process(target=piao,args=('yxx',))p_l=[p1,p2,p3]for p in p_l:p.start()for p in p_l:p.join()print('主')

利用多进程实现ftp套接字

我们之前写过非多进程的tcp套接字通信,这里在贴出代码来看下
server

import socket
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8081))
server.listen(5)
while True:conn,addr = server.accept()while True:data = conn.recv(1024)if not data:breakdataStr = data.decode("utf-8")print(dataStr)conn.send(dataStr.upper().encode("utf-8"))conn.close()server.close()

client

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(("127.0.0.1",8081))while True:msg = input("请输入:")if not msg:continueclient.send(msg.encode("utf-8"))data = client.recv(1024)print(data.decode("utf-8"))
client.close()

我们要为server端添加多进程(client不做修改)

import socket
from multiprocessing import Processdef task(conn,addr):while True:try:msg = conn.recv(1024)if not msg:breakconn.send(msg.upper())except ConnectionResetError:breakif __name__ == "__main__":server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)server.bind(("127.0.0.1", 6087))server.listen(5)while True:conn, addr = server.accept()p = Process(target=task,args=(conn,addr))p.start()

这里写图片描述

这篇关于python基础-Process创建进程、join方法、实现ftp多进程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125191

相关文章

使用Python实现矢量路径的压缩、解压与可视化

《使用Python实现矢量路径的压缩、解压与可视化》在图形设计和Web开发中,矢量路径数据的高效存储与传输至关重要,本文将通过一个Python示例,展示如何将复杂的矢量路径命令序列压缩为JSON格式,... 目录引言核心功能概述1. 路径命令解析2. 路径数据压缩3. 路径数据解压4. 可视化代码实现详解1

python获取网页表格的多种方法汇总

《python获取网页表格的多种方法汇总》我们在网页上看到很多的表格,如果要获取里面的数据或者转化成其他格式,就需要将表格获取下来并进行整理,在Python中,获取网页表格的方法有多种,下面就跟随小编... 目录1. 使用Pandas的read_html2. 使用BeautifulSoup和pandas3.

PyQt6/PySide6中QTableView类的实现

《PyQt6/PySide6中QTableView类的实现》本文主要介绍了PyQt6/PySide6中QTableView类的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录1. 基本概念2. 创建 QTableView 实例3. QTableView 的常用属性和方法

Python装饰器之类装饰器详解

《Python装饰器之类装饰器详解》本文将详细介绍Python中类装饰器的概念、使用方法以及应用场景,并通过一个综合详细的例子展示如何使用类装饰器,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. 引言2. 装饰器的基本概念2.1. 函数装饰器复习2.2 类装饰器的定义和使用3. 类装饰

PyQt6/PySide6中QTreeView类的实现

《PyQt6/PySide6中QTreeView类的实现》QTreeView是PyQt6或PySide6库中用于显示分层数据的控件,本文主要介绍了PyQt6/PySide6中QTreeView类的实现... 目录1. 基本概念2. 创建 QTreeView 实例3. QTreeView 的常用属性和方法属性

Python 交互式可视化的利器Bokeh的使用

《Python交互式可视化的利器Bokeh的使用》Bokeh是一个专注于Web端交互式数据可视化的Python库,本文主要介绍了Python交互式可视化的利器Bokeh的使用,具有一定的参考价值,感... 目录1. Bokeh 简介1.1 为什么选择 Bokeh1.2 安装与环境配置2. Bokeh 基础2

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Spring 中的循环引用问题解决方法

《Spring中的循环引用问题解决方法》:本文主要介绍Spring中的循环引用问题解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录什么是循环引用?循环依赖三级缓存解决循环依赖二级缓存三级缓存本章来聊聊Spring 中的循环引用问题该如何解决。这里聊

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Golang HashMap实现原理解析

《GolangHashMap实现原理解析》HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,:本文主要介绍GolangH... 目录HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持