python多进程的实现

进程运行的时候,向CPU提出申请请求,CPU根据内存使用情况,进程分配内存地址,若CPU分配的内存足够该进程使用,则进程结束;若CPU分配的内存不足以进程运行,这样导致进程未能运行结束,进程重新向CPU申请新的内存单元,但这是CPU未必有多余的内存单元,只有当CPU存在空闲的内存单元,才会相应申请,重新给进程分配内存,进程接着上一次运行。

进程中的数据是独立存在不会因为子进程的改变,从而导致主进程的改变。但是线程是数据共享,可以改变数值。

具体的例子如下代码,证实进程中数据是独立存在:

# 模块的引入
from multiprocessing import Process
import time


def child_process(a):
    a += 1
    print(a, "child")


# 主进程执行代码
if __name__ == '__main__':
    a = 3
    # 创建进程,target为子进程的程序段,args为资源(是一个元组,可省略)
    p = Process(target=child_process, args=(a,))
    # 子进程的开始
    p.start()
    time.sleep(2)
    print(a, "main")



# 运行结果
4
# 中间间隔了两秒钟
3 main

分析:

下面用面向对象的思想实现一个简单的多进程售票例子:

from multiprocessing import Process
import os
import time

# 创建一个类,继承Process类
class TicketProcess(Process):
    # 初始化方法,重写父类,添加票属性
    def __init__(self, tickets):
        super().__init__()
        self.tickets = tickets
    # 此时的run方法相当于target=run,后者是在面向过程中定义p = Process(target=run)中使用的
    # 二者的本质是相同,只是用法不用
    def run(self):
        for k in self.tickets:
            # time.sleep(0.1)
            print(f"进程{os.getpid()}正在售票,售出的票号为{k}")


if __name__ == '__main__':
    # 生成票,将生成的票存放在列表中
    tickets = [x for x in range(1, 301)]
    start = time.time()
    pools = []
    for t in range(3):
        # 创建进程,将tickets切片,分成三个
        p = TicketProcess(tickets[t * 100:(t + 1) * 100])
        # 子进程开始执行
        p.start()
        pools.append(p)
    # 根据pools列表的顺序执判断,(0,1,2)的顺序执行join方法,只有当左右的join方法执行完后,则判断为整个主进程运行结果
    # 然后执行for循环后面的方法
    for pool in pools:
        pool.join()
    end = time.time()
    print(f"整个售票花费了{end - start}秒")

进程中,要注意进程中start和join方法的应用,不然会出现很多问题,主进程最好全部写在__main__方法内,同样也是为了避免程序出现问题。

猜你喜欢

转载自blog.csdn.net/qq_41292236/article/details/94650697