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的时候可以共享锁。

  • 4
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Python 多进程可以通过 `multiprocessing` 模块来实现。该模块提供了 `Process` 类,可以用来创建新的进程。以下是一个简单的例子: ```python import multiprocessing def worker(): """子进程执行的任务""" print('Worker') if __name__ == '__main__': # 创建子进程 p = multiprocessing.Process(target=worker) # 启动进程 p.start() # 等待进程结束 p.join() ``` 上述代码中,首先定义了一个 `worker()` 函数作为子进程要执行的任务,然后通过 `multiprocessing.Process()` 创建子进程,并指定要执行的任务。最后,通过 `start()` 方法启动进程,然后通过 `join()` 方法等待进程结束。 另外,还可以使用 `Pool` 类来创建进程池。例如,如果要创建 4 个子进程,可以这样写: ```python import multiprocessing def worker(num): """子进程执行的任务""" print(f'Worker {num}') if __name__ == '__main__': # 创建进程池 pool = multiprocessing.Pool(4) # 启动子进程 for i in range(4): pool.apply_async(worker, args=(i,)) # 关闭进程池 pool.close() # 等待所有子进程结束 pool.join() ``` 上述代码中,首先创建了一个进程池,指定最大进程数为 4。然后通过 `apply_async()` 方法启动 4 个子进程,并指定要执行的任务和参数。最后,通过 `close()` 方法关闭进程池,然后通过 `join()` 方法等待所有子进程结束。 ### 回答2: Python多进程是指在一个程序中同时运行多个进程。在Python中,可以通过使用multiprocessing模块来创建和管理多个进程。 使用多进程的好处是可以同时执行多个任务,从而提高程序的运行效率。在处理CPU密集型任务时,多进程可以将任务分配给多个CPU核心并行处理,从而加快任务的完成速度。在处理IO密集型任务时,可以利用多进程来并行处理多个IO操作,从而减少等待时间,提高程序的响应速度。 创建多进程的方法是通过创建Process对象,并指定要执行的函数或方法。然后,通过调用start()方法启动进程。可以使用join()方法等待进程执行完毕。 在父进程和子进程之间可以通过共享内存来进行数据交换。Python的multiprocessing模块提供了多种方式来实现进程间的通信,如Queue、Pipe等。这样,不同的进程就可以相互传递数据、共享资源,从而完成协同工作。 需要注意的是,在使用多进程时,要注意进程间的同步和互斥,以避免数据竞争和死锁等问题。可以使用锁、信号量等同步机制来保护共享资源的访问。此外,还可以使用进程池来管理多个进程,从而更加方便地调度和管理进程的运行。 总而言之,Python多进程是一种充分利用多核CPU和并行计算能力的方法,可以提高程序的运行效率和响应速度。在实际应用中,可以根据任务的特点选择合适的多进程方式,从而充分发挥多进程的优势。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.Q

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

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

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

打赏作者

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

抵扣说明:

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

余额充值