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

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

MySQL数据库双机热备的配置方法详解

《MySQL数据库双机热备的配置方法详解》在企业级应用中,数据库的高可用性和数据的安全性是至关重要的,MySQL作为最流行的开源关系型数据库管理系统之一,提供了多种方式来实现高可用性,其中双机热备(M... 目录1. 环境准备1.1 安装mysql1.2 配置MySQL1.2.1 主服务器配置1.2.2 从

C++中unordered_set哈希集合的实现

《C++中unordered_set哈希集合的实现》std::unordered_set是C++标准库中的无序关联容器,基于哈希表实现,具有元素唯一性和无序性特点,本文就来详细的介绍一下unorder... 目录一、概述二、头文件与命名空间三、常用方法与示例1. 构造与析构2. 迭代器与遍历3. 容量相关4

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

C++中悬垂引用(Dangling Reference) 的实现

《C++中悬垂引用(DanglingReference)的实现》C++中的悬垂引用指引用绑定的对象被销毁后引用仍存在的情况,会导致访问无效内存,下面就来详细的介绍一下产生的原因以及如何避免,感兴趣... 目录悬垂引用的产生原因1. 引用绑定到局部变量,变量超出作用域后销毁2. 引用绑定到动态分配的对象,对象

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三