Python网络编程 —— 进程

简介: 个人独立博客:www.limiao.tech微信公众号:TechBoard进程进程:通俗理解就是一个运行的程序或者软件,进程是操作系统资源分配的基本单位一个程序至少有一个进程,一个进程至少有一个线程,多进程可以完成多任务进程的状态...

个人独立博客:www.limiao.tech
微信公众号:TechBoard


进程

进程:通俗理解就是一个运行的程序或者软件,进程是操作系统资源分配的基本单位

一个程序至少有一个进程,一个进程至少有一个线程,多进程可以完成多任务

进程的状态

工作中,任务数往往大于cpu的核数,即一定有一些任务正在执行,而另外一些任务在等待cpu进行执行,因此导致了有了不同的状态

进程的使用

导入进程模块:

import multiprocessing

用进程完成多任务

import multiprocessing
import time


def sing():
    for i in range(10):
        print("唱歌中...")
        time.sleep(0.2)

def dance():
    for i in range(10):
        print("跳舞中...")
        time.sleep(0.2)

if __name__ == "__main__":
    # 创建对应的子进程执行对应的任务
    sing_process = multiprocessing.Process(target=sing)
    dance_process = multiprocessing.Process(target=dance)

    # 启动进程执行对应的任务
    sing_process.start()
    dance_process.start()

Process类参数介绍
import multiprocessing
import os


def show_info(name,age):
    print("show_info:", multiprocessing.current_process())
    
    # 获取进程的编号
    pritn("show_info pid:", multiprocessing.current_process().pid, os.getpid)
    print(name, age)

if __name__ == "__main__":
    # 创建子进程
    # group: 进程组,目前只能使用None
    # target: 执行的目标任务
    # args: 以元组方式传参
    # kwargs: 以字典方式传参
    sub_prcess = multiprocessing.Process(group=None, target=show_info, arg=("杨幂", 18))
    sub_prcess.start()

进程之间不共享全局变量
import multiprocessing
import time


# 全局变量
g_list = []

# 添加数据
def add_data():
    for i in range(15):
        g_list.append(i)
        time.sleep(0.1)
    print("add_data:", g_list)

# 读取数据
def read_data():
    print("read_data:", g_list)

if __name__ == "__main__":
    # 创建添加数据的子进程
    add_process = multiprocessing.Process(target=add_data)
    # 创建读取数据的子进程
    read_process = multiprocessing.Process(target=read_data)

    # 启动进程
    add_process.start()
    # 主进程等待添加数据的子进程执行完成以后再执行读取进程的操作
    add_process.join()
    # 代码执行到此说明添加数据的子进程把任务执行完成了
    read_process.start()

创建子进程其实就是对主进程资源的拷贝

主进程会等待所有的子进程执行完成程序再退出

import multiprocessing
import time


# 工作任务
def work():
    for i in range(10):
        print("工作中...")
        time.sleep(0.3)

if __name__ == "__main__":
    # 创建子进程
    sub_prcess = multiprocessing.Process(target=work)
    # 查看进程的守护状态
    # print(sub_prcess.daemon)
    # 守护主进程,主进程退出子进程直接销毁,不再执行子进程里面的代码
    # sub_prcess.daemon = True
    # 启动进程执行对应的任务
    sub_process.start()

    # 主进程延时1s
    time.sleep(1)
    print("主进程执行完了")
    # 主进程退出之前把所有的子进程销毁
    sub_prcess.terminate()
    exit()

总结: 主进程会等待所有的子进程执行完成程序再退出

获取进程pid
# 获取进程pid
import multiprocessing
import time
import os


def work():
    # 获取当前进程编号
    print("work进程编号:", os.getpid())
    # 获取父进程编号
    print("work父进程编号:", os.getppid())

    for i in range(10):
        print("工作中...")
        time.sleep(1)
        # 扩展:根据进程编号杀死对应的进程
        # os.kill(os.getpid(), 9)

if __name__ == '__main__':
    # 获取当前进程的编号:
    print("当前进程编号:", multiprocessing.current_process().pid)

    # 创建子进程
    sub_process = multiprocessing.Process(target=work)
    # 启动进程
    sub_process.start()


    # 主进程执行打印信息操作
    for i in range(20):
        print("我在主进程中执行...")
        time.sleep(1)
运行结果:

当前进程编号: 624
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
work进程编号: 1312
work父进程编号: 624
工作中...
工作中...
工作中...
工作中...
工作中...
工作中...
工作中...
工作中...
工作中...
工作中...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...
我在主进程中执行...

***Repl Closed***
进程间通信——Queue

可以使用multiprocessing模块Queue实现多进程之间的数据传递,Queue本身是一个消息队列程序

import multiprocessing


if __name__ == "__main__":
    # 创建消息队列
    # 3:表示消息队列的最大个数
    queue = multiprocessing.Queue(3)
    # 存放数据
    queue.put(1)
    queue.put("hello")
    queue.put([1, 5, 8])
    # 总结:队列可以放入任意类型的数据
    
    # queue.put("xxx": "yyy")
    # 放入消息的时候不会进行等待,如果发现队列满了不能放入数据,那么会直接崩溃
    # 建议: 放入数据统一使用 put 方法
    # queue.put_nowait(("xxx": "yyy"))

    # 判断队列是否满了
    result = queue.full()
    print(result)
    # 判断队列是否为空,不靠谱(加延时可解决)
    result = queue.empty()
    print("队列是否为空:", result)

    # 获取队列消息个数
    size = queue.qsize()
    print("消息个数:", size)
    # 获取队列中的数据
    res = queue.get()
    print(res)
    # 如果队列空了,那么使用get方法会等待队列有消息以后再取值

消息队列Queue完成进程间通信的演练

import multiprocessing
import time


# 添加数据
def add_data(queue):
    for i in range(5):
        # 判断队列是否满了
        if queue.full():
            # 如果满了跳出循环,不再添加数据
            print("队列满了")
            break
        queue.put(i)
        print("add:", i)
        time.sleep(0.1)

def read_data(queue):
    while True:

        if queue.qsize == 0:
            print("队列空了")
            break

        result = queue.get()
        print("read:", result)


if __name__ == "__main__":
    # 创建消息队列
    queue = multiprocessing.Queue(3)

    # 创建添加数据的子进程
    add_process = multiprocessing.Process(target=add_data, args=(queue,))

    # 创建读取数据的子进程
    read_process = multiprocessing.Process(target=read_data, args=(queue,))

    # 启动进程
    add_process.start()
    # 主进程等待写入进程执行完成以后代码再继续往下执行
    add_process.join()
    read_process.start()
进程池Pool
进程池的概念

池子里面放的是进程,进程池会根据任务执行情况自动创建进程,而且尽量少创建进程,合理利用进程池中的进程完成多任务

当需要创建的子进程数量不多时,可以直接利用multiprocess中的Process动态生成多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocess模块提供的Pool方法。

初始化Pool时,可以指定一个最大进程数,当有新的请求提到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求,但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务。

进程池同步执行任务

进程池同步执行任务表示进程池中的进程在执行任务的时候一个执行完成另外一个才能执行,如果没有执行完会等待上一个进程执行

进程池同步实例代码

import multiprocessing
import time


# 拷贝任务
def work():
    print("复制中...", multiprocessing.current_process().pid)
    time.sleep(1)

if __name__ == '__main__':
    # 创建进程池
    #3:进程池中进程的最大个数
    pool = multiprocessing.Pool(3)
    # 模拟大批量的任务,让进程池去执行
    for i in range(5):
        # 循环让进程池执行对应的work任务
        # 同步执行任务,一个任务执行完成以后另外一个任务才能执行
        pool.apply(work)
运行结果:

复制中... 6172
复制中... 972
复制中... 972
复制中... 1624
复制中... 1624

***Repl Closed***
进程池异步执行任务

进程池异步执行任务表示进程池中的进程同时执行任务,进程之间不会等待

进程池异步实例代码

import multiprocessing
import time


# 拷贝任务
def work():
    print("复制中...", multiprocessing.current_process().pid)

    # 获取当前进程的守护状态
    # 提示:使用进程池创建的进程时守护主进程的状态,默认自己通过Process创建的进程是不守护主进程的状态
    # print(multiprocessing.current_process().daemon)
    time.sleep(1)

if __name__ == '__main__':
    # 创建进程池
    # 3:进程池中进程的最大个数
    pool = multiprocessing.Pool(3)
    # 模拟大批量的任务,让进程池去执行
    for i in range(5):
        # 循环让进程池执行对应的work任务
        # 同步执行任务,一个任务执行完成以后另外一个任务才能执行
        # pool.apply(work)
        # 异步执行,任务执行不会等待,多个任务一起执行
        pool.apply_async(work)

    # 关闭进程池,意思告诉主进程以后不会有新的任务添加进来
    pool.close()
    # 主进程等待进程池执行完成以后程序再退出
    pool.join()
运行结果:

复制中... 1848
复制中... 12684
复制中... 12684
复制中... 6836
复制中... 6836

***Repl Closed***

个人独立博客:www.limiao.tech
微信公众号:TechBoard


目录
相关文章
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
72 4
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
1月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
287 55
|
2月前
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
114 2
|
2月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
147 6
|
1月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
190 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
21天前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
1月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
90 3
|
2月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
67 6
|
2月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
90 8
|
2月前
|
数据采集 XML 存储
构建高效的Python网络爬虫:从入门到实践
本文旨在通过深入浅出的方式,引导读者从零开始构建一个高效的Python网络爬虫。我们将探索爬虫的基本原理、核心组件以及如何利用Python的强大库进行数据抓取和处理。文章不仅提供理论指导,还结合实战案例,让读者能够快速掌握爬虫技术,并应用于实际项目中。无论你是编程新手还是有一定基础的开发者,都能在这篇文章中找到有价值的内容。