python 多进程同步运行多个函数

场景:一个进程控制吃饭函数,另一个进程控制睡觉函数,同步进行。

结论,运行时间:不用进程 > 函数形式进程 == 类形式进程

目录

1.不用进程

2.函数形式进程 multiprocessing.Process()

3.类形式进程 multiprocessing.Process类

注:不用多线程的原因:

1. 进程和线程:

2. 全局解释器锁对多线程的影响

1.不用进程

用时:6s

import time
import multiprocessing


def eat(p_name):
    for i in range(3):
        print(p_name, "eat1")
        time.sleep(1)


def sleep(p_name):
    for i in range(3):
        print(p_name, "sleep2")
        time.sleep(1)


if __name__ == '__main__':
    start = time.time()
    eat("1")
    sleep("2")

    print(str(round(time.time() - start, 3)) + 's')

输出:

1 eat1
1 eat1
1 eat1
2 sleep2
2 sleep2
2 sleep2
6.043s

2.函数形式进程 multiprocessing.Process()

用时:3s

import time
import multiprocessing


def eat(p_name):
    for i in range(3):
        print(p_name, "eat1")
        time.sleep(1)


def sleep(p_name):
    for i in range(3):
        print(p_name, "sleep2")
        time.sleep(1)


if __name__ == '__main__':
    start = time.time()
    p1 = multiprocessing.Process(target=eat, args=("p1", ))
    p2 = multiprocessing.Process(target=sleep, args=("p2", ))

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print(str(round(time.time() - start, 3)) + 's')

输出:

p1 eat1
p2 sleep2
p1 eat1
p2 sleep2
p1 eat1
p2 sleep2
3.086s

3.类形式进程 multiprocessing.Process类

用时:3s

import time
import multiprocessing


def eat(p_name):
    for i in range(3):
        print(p_name, "eat1")
        time.sleep(1)


def sleep(p_name):
    for i in range(3):
        print(p_name, "sleep2")
        time.sleep(1)


class Life(multiprocessing.Process):
    def __init__(self, life_type, p_name):
        multiprocessing.Process.__init__(self)
        self.life_type = life_type
        self.p_name = p_name

    def run(self):
        self.life_type(self.p_name)


if __name__ == '__main__':
    start = time.time()

    p1 = Life(eat, "p1")
    p2 = Life(sleep, "p2")

    p1.start()
    p2.start()

    p1.join()
    p2.join()

    print(str(round(time.time() - start, 3)) + 's')

p1 eat1
p2 sleep2
p2 sleep2
p1 eat1
p2 sleep2
p1 eat1
3.066s


:不用多线程的原因:

参考:Python中全局解释器锁、多线程和多进程 - 知乎

1. 进程和线程:

操作系统可以同时执行多个任务,每一个任务就是一个进程,进程可以同时执行多个子任务,每一个子任务就是一个线程。

  • 当一个进程里只有一个线程时,叫作单线程。超过一个线程就叫作多线程;
  • 多个线程共享父进程里的全部资源,会使得编程更加方便;
  • 多线程也是并发执行的,即同一时刻,python主程序只允许有一个线程执行,这和全局解释器(管理内存引用计数)有关系

2. 全局解释器锁对多线程的影响

首先我们应该区分不同性质的任务,有一些是CPU密集型的任务,有一些是I/O密集型的任务。

  • CPU密集型的任务在最大程度上使用了CPU,比如数学矩阵的计算、图像处理、文件解压缩等。
  • I/O密集型任务在需要花费很多时间来等待信息的输入和输出(读写),比如从网址下载内容,大量访问磁盘进行读写等。

对于CPU密集型的任务,多线程使用的时间比单线程还多,这就是全局解释器锁带来的问题。但是如果是I/O密集型的任务,全局解释器锁就不会再有这种影响,各个线程在等待I/O的时候可以共享锁。

猜你喜欢

转载自blog.csdn.net/jizhidexiaoming/article/details/121290018