【Python】进程和多进程的使用

本文探讨了进程的概念、服务器进程类型及其在服务器中的作用,介绍了Python中实现多进程的方法,如multiprocessing模块和concurrent.futures模块,并提到了Windows和Linux下的进程终止。同时,也关注了在仅执行一个程序时的进程管理策略和线程使用。
摘要由CSDN通过智能技术生成

原文作者:我辈李想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。



前言

进程是指计算机中正在运行的程序实例。
进程可以是操作系统分配的,也可以由其他进程创建。
每个进程都有自己的执行状态、内存空间和系统资源。
每个进程都是独立的,有自己独立的地址空间,因此它们之间不会相互干扰。
进程可以并发执行,即多个进程可以同时运行在计算机上。
操作系统负责管理进程的创建、调度、终止和资源分配。
进程之间可以通过进程间通信来进行数据传递和共享。


一、进程

1.概念理解

服务器的进程是指在服务器上运行的程序或任务。这些进程负责处理客户端请求、提供服务、处理数据等操作。常见的服务器进程包括:

  1. Web服务器进程:负责接收和响应HTTP请求,提供网页内容和服务,如Apache、Nginx等。
  2. 数据库服务器进程:负责管理和处理数据库操作,如MySQL、Oracle等。
  3. 文件服务器进程:负责管理和处理文件存储和传输,如FTP服务器。
  4. 邮件服务器进程:负责处理邮件的收发、存储和传输,如SMTP服务器、POP3服务器、IMAP服务器。
  5. DNS服务器进程:负责域名解析,将域名转换为IP地址,如BIND服务器。
  6. DHCP服务器进程:负责分配和管理IP地址及其他网络配置信息,如DHCP服务器。
  7. 防火墙进程:负责网络流量的过滤和监控,如iptables等。
  8. 安全认证服务器进程:负责用户认证和授权,如LDAP服务器、Radius服务器等。
  9. 远程登录服务器进程:负责用户远程登录和交互,如SSH服务器、Telnet服务器等。

这些服务器进程通过监听特定的网络端口,等待客户端发起请求,并根据请求的类型和内容进行相应的处理和回应。

服务器的进程可以是各种不同类型的应用程序,如Web服务器、数据库服务器、邮件服务器等。每个服务器进程通常都有一个唯一的标识符,以便在操作系统中进行识别和管理。

服务器进程的设计和实现是服务器应用程序开发中的重要部分。它决定了服务器的性能、可靠性和安全性。服务器进程需要考虑并发处理、负载均衡、数据管理、安全认证等方面的问题,以确保服务器能够有效地运行并提供高质量的服务。

2.进程的启动

进程的启动是指操作系统在接收到用户或程序的请求后,为其创建一个新的进程并使其运行起来的过程。

进程的启动包括以下几个步骤:

  1. 程序加载:操作系统首先会从磁盘或其他存储介质中加载待运行的程序到内存中。加载的过程中,操作系统会进行一些初始化操作,如分配内存空间、建立虚拟地址空间等。

  2. 资源分配:操作系统会为新创建的进程分配所需要的资源,如 CPU 时间片、内存空间、文件描述符等。这些资源的分配是根据系统的调度算法和进程的优先级来决定的。

  3. 进程控制块初始化:操作系统会为每个进程创建一个进程控制块(Process Control Block,PCB),用于存储进程的相关信息,如进程状态、程序计数器(PC)、寄存器的值、文件描述符表等。PCB 是操作系统管理和控制进程的重要数据结构。

  4. 上下文切换:在启动新进程之前,操作系统需要保存当前进程的上下文信息,包括当前进程的寄存器状态、程序计数器等。然后根据调度算法选择一个进程来执行,将其上下文信息加载到 CPU 中,使其开始执行。

  5. 执行进程:一旦新进程被加载到 CPU 中,并且操作系统将控制权交给该进程,进程就开始执行指令。进程执行期间,操作系统会根据调度算法决定如何分配 CPU 时间片,以及在必要时进行进程切换。

进程的启动是操作系统中的一个核心功能,操作系统需要负责合理地分配资源、管理进程状态,并保证进程的正常运行。同时,进程的启动也需要花费一定的时间和系统开销,因此操作系统需要进行优化以提高启动的效率。

3.python进程

执行 python main.py 命令会运行名为 main.py 的 Python 脚本文件。这是一种常见的方式来启动一个 Python 应用程序。

当你执行这个命令时,Python 解释器会读取 main.py 文件并逐行执行其中的代码。这样,你就可以在 main.py 中编写你的应用程序逻辑,并在命令行中运行它。

请注意,在运行 python main.py 之前,你需要确保已经安装了 Python 解释器,并且已经设置了正确的环境变量。如果一切都配置正确,那么执行 python main.py 命令应该会运行你的应用程序。

通过cmd中python启动程序,会创建一个进程,进程中会开启一个主线程,main的内容是在主线程中执行。每一个进程有名称、PID、状态、内存等信息。
在这里插入图片描述

二、多进程

在Python中,有多种方法可以实现多进程。下面是两种常用的方法:

  1. 使用multiprocessing模块:multiprocessing模块是Python内置的用于实现多进程的模块。它提供了一个Process类,可以创建一个新的进程,并通过调用其start()方法来启动进程。以下是一个使用multiprocessing模块创建和启动进程的示例代码:
from multiprocessing import Process

def my_function():
    # 进程要执行的任务
    print("Hello from a child process!")

if __name__ == "__main__":
    # 创建进程
    p = Process(target=my_function)
    # 启动进程
    p.start()
    # 等待所有任务完成
    p.join()
import multiprocessing
from multiprocessing import Pool

if __name__ == '__main__':
    try:
    	# 进程池
        p = Pool(7)

        # 写入日志
        p.apply_async(write_log_from_queue, args=(log_queue,))
        
        p.close()
        p.join()
    except Exception as e:
        print("算法接口主程序出现异常: {}".format(e), flush=True)
在这里插入代码片

除了Process类,multiprocessing模块还提供了其他类和函数来实现不同的进程管理功能,例如Pool类用于创建进程池,Queue类用于进程间通信等。

需要注意的是,在Windows操作系统中,由于Python的GIL(全局解释器锁)限制,多个进程之间的共享数据可能会有问题。在这种情况下,可以使用`multiprocessing.Manager`类来创建进程间共享的数据结构。
  1. 使用concurrent.futures模块:concurrent.futures模块是Python 3引入的用于并发编程的模块,它提供了一个ProcessPoolExecutor类,可以用于创建一个进程池,并通过调用其submit()方法来提交任务。以下是一个使用concurrent.futures模块创建和启动进程的示例代码:
from concurrent.futures import ProcessPoolExecutor,ThreadPoolExecutor

def my_function():
    # 进程要执行的任务
    print("Hello from a child process!")

if __name__ == "__main__":
    # 创建进程池
    with ProcessPoolExecutor() as executor:
        # 提交任务给进程池
        future = executor.submit(my_function)
        # 获取任务的结果
        result = future.result()
        print(result)

以上示例中的my_function()是进程要执行的任务。通过调用相应的方法,可以创建、启动并等待进程结束。注意在使用多进程时,在主程序中使用if __name__ == "__main__":来确保代码在主进程中执行。

无论使用哪种方法,多进程可以提高程序的性能和并行处理能力,特别适用于需要处理大量数据或执行耗时任务的情况。使用多进程时,还需要注意进程间的通信和同步,以确保数据的一致性和正确性。

三、只执行一个程序

import os
import threading


def kill(pid):
    # 本函数用于中止传入pid所对应的进程
    if os.name == 'nt':
        # Windows系统
        cmd = 'taskkill /pid ' + str(pid) + ' /f'
        try:
            os.system(cmd)
            print(pid, 'killed')
        except Exception as e:
            print(e)
    elif os.name == 'posix':
        # Linux系统
        cmd = 'kill ' + str(pid)
        try:
            os.system(cmd)
            print(pid, 'killed')
        except Exception as e:
            print(e)
    else:
        print('Undefined os.name')


class MyThread(threading.Thread):

    def __init__(self):
        super().__init__()
        # self.num = num # 自定义参数

    def run(self):
        # 线程的任务
        print('111')
        return 'ok'


if __name__ == '__main__':

    # 1.读取上次保存的pid
    f1 = open(file='feishu_pid.txt', mode='r')
    pid = f1.read()
    f1.close()
    # 2.如果存在杀死上一次的进程
    print('上一次进程', pid)
    if pid:
        # 调用kill函数,终止进程
        kill(pid=pid)

    # 3.获取当前进程的pid
    pid = os.getpid()
    print('当前进程的pid: ', pid)

    # 4.将pid写入本地文件,供下次调用
    f2 = open(file='feishu_pid.txt', mode='w')
    f2.write(pid.__str__())
    f2.close()
    # 5.开启新的线程
    my = MyThread()
    # 如果有参数
    # my = MyThread(num=1)
    my.start()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我辈李想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值