python多进程中apply和apply_async用法详解

这篇具有很好参考价值的文章主要介绍了python多进程中apply和apply_async用法详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        python在同一个线程中多次执行同一方法时,假设该方法执行耗时较长且每次执行过程及结果互不影响,如果只在主进程中执行,效率会很低,因此使用multiprocessing.Pool(processes=n)及其apply_async()方法提高程序执行的并行度从而提高程序的执行效率,其中processes=n为程序并行执行的进程数。

apply()方法是阻塞的,也就是说等待当前子进程执行完毕后,再执行下一个进程。

示例代码:

import time
import multiprocessing


def apply_test(s):
    time.sleep(3)
    print('info: %s' % s)


if __name__ == '__main__':
    print('开始主进程。。。')
    start = time.time()
    # 使用线程池建立3个子进程
    pool = multiprocessing.Pool(3)
    print('开始3个子进程。。。')
    for i in range(3):
        pool.apply(apply_test, [i])
    print('主进程结束,耗时 %s' % (time.time() - start))

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

apply_async()是异步非阻塞式,不用等待当前进程执行完毕,随时跟进操作系统调度来进行进程切换,即多个进程并行执行,提高程序的执行效率。

示例代码1:

import time
import multiprocessing


def apply_test(s):
    time.sleep(3)
    print('info: %s' % s)


if __name__ == '__main__':
    print('开始主进程。。。')
    start = time.time()
    # 使用线程池建立3个子进程
    pool = multiprocessing.Pool(3)
    print('开始3个子进程。。。')
    for i in range(3):
        pool.apply_async(apply_test, [i])
    print('主进程结束,耗时 %s' % (time.time() - start))
    
    # 为了演示效果,这儿使用休眠方式
    time.sleep(10)

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

示例代码2:  【主进程等待子进程都结束再结束】

import time
import multiprocessing


def apply_test(s):
    time.sleep(3)
    print('info: %s' % s)


if __name__ == '__main__':
    print('开始主进程。。。')
    start = time.time()
    # 使用线程池建立3个子进程
    pool = multiprocessing.Pool(3)
    print('开始3个子进程。。。')
    for i in range(3):
        pool.apply_async(apply_test, [i])
    pool.close()
    pool.join()
    print('主进程结束,耗时 %s' % (time.time() - start))

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

示例代码3:

import time
import random
import multiprocessing


def func(x):
    ts = random.randint(1, 10)
    time.sleep(ts)
    print(f'{x}执行完毕!耗时{ts}s')


if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(6):
        print(f"开始执行第{i}个任务...")
        pool.apply_async(func, args=(i, ))
    pool.close()
    pool.join()

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

        在使用apply_async()方法接收多个参数的方法时,在任务方法中正常定义多个参数,参数以元组形式传入即可 但是给apply_async()方法传入多个值获取多个迭代结果时就会报错,因为该方法只能接收一个值,所以可以将该方法放入一个列表生成式中。

示例代码4:

import multiprocessing


def func(x):
    return x ** 2


if __name__ == '__main__':
    pool = multiprocessing.Pool()
    res = [pool.apply_async(func, (i, )) for i in range(6)]
    print([x for x in res])
    print([x.get() for x in res])
    pool.close()
    pool.join()

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

        有时候在使用多进程或者多线程执行程序时,当程序有bug时,某个进程或者线程可能会挂掉,但是自己又不容易或者很难发现是哪个线程或进程挂掉了。如示例代码5所示:

示例代码5:

import time
import random
import multiprocessing


def func(x, y):
    ret = x / y
    return ret


def task(i):
    ts = random.randint(1, 10)
    time.sleep(ts)
    nums = [-1, 0, 1, 2]
    x, y = random.choice(nums), random.choice(nums)
    value = func(x, y)
    print(f'{i}执行完毕!耗时{ts}s,结果为{value}')


if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(6):
        print(f"开始执行第{i}个任务...")
        pool.apply_async(task, args=(i,))
    pool.close()
    pool.join()

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

        在上述例子中,我们是打印了某个进程号,但真正项目中是不会这样打印日志的,就很难发现某个进程或者线程已经挂掉了,这时候需要使用回调函数,打印某个进程或者线程挂掉的error信息,如示例代码6所示。

示例代码6:

import time
import random
import multiprocessing


def func(x, y):
    ret = x / y
    return ret


def task(i):
    ts = random.randint(1, 10)
    time.sleep(ts)
    nums = [-1, 0, 1, 2]
    x, y = random.choice(nums), random.choice(nums)
    value = func(x, y)
    print(f'{i}执行完毕!耗时{ts}s,结果为{value}')


def error_callback(error):
    print(f"Error info: {error}")


if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(6):
        print(f"开始执行第{i}个任务...")
        pool.apply_async(task, args=(i,), error_callback=error_callback)
    pool.close()
    pool.join()

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

        上述执行结果就很容易看出进程或者线程在运行过程中有挂掉的,而且打印出了挂掉的原因,也有利用我们后期排除程序中的bug。

        同样的,除了想让报错的程序回调一下,同时也想让异步函数执行完毕也给一个回调响应值,这时可以加上callback参数,响应结果,如示例代码7所示。

示例代码7:

import time
import random
import multiprocessing


def func(x, y):
    ret = x / y
    return ret


def task(i):
    ts = random.randint(1, 10)
    time.sleep(ts)
    nums = [-1, 0, 1, 2]
    x, y = random.choice(nums), random.choice(nums)
    value = func(x, y)
    # print(f'{i}执行完毕!耗时{ts}s,结果为{value}')
    return f'{i}执行完毕!耗时{ts}s,结果为{value}'


def error_callback(error):
    print(f"Error info: {error}")


def call_back(info):
    print(f"Right info: {info}")


if __name__ == '__main__':
    pool = multiprocessing.Pool(6)
    for i in range(6):
        print(f"开始执行第{i}个任务...")
        pool.apply_async(task, args=(i,), callback=call_back, error_callback=error_callback)
    pool.close()
    pool.join()

运行结果:

apply_async,python高级,python,多进程,apply_async,apply

注意:join()等待所有子进程结束后再运行,使用join()前先使用close()关闭它。文章来源地址https://www.toymoban.com/news/detail-687157.html

到了这里,关于python多进程中apply和apply_async用法详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python中的async和await用法

    前言:此篇文章是在文心一言的辅助下完成的。 同步操作 :同步操作是指所有的操作都完成后,才返回给用户结果。当一个任务发出请求并等待响应时,如果未收到响应,该任务就会被阻塞,并一直等待直到收到响应为止。例如,在一个同步过程中,如果有一个函数需要较

    2024年04月27日
    浏览(32)
  • 一段代码理解Python异步函数async的基本用法

    异步函数的使用规则 正常情况下我们的函数时串行的运行的,这里称之为主函数. 异步函数:与主函数并行运行. Python异步函数即async必须在普通函数的命名前加上 async 示例: 执行async函数 async函数内等待:只阻塞当前async函数 m_mock安装 通过上述代码示例可以发现case_a和case_b通过

    2024年02月15日
    浏览(52)
  • MySQL Select 查询语句详解及高级用法

    MySQL是一个开源的关系型数据库管理系统,支持多种操作语言,其中最基础、最常用的命令之一就是SELECT语句。在本篇文章中,这里将详细介绍MySQL SELECT语句的各个方面,从最基本的查询语句,到更高级的技巧和功能。 SELECT语句用于从表格中检索数据。其基本语法如下: sq

    2024年02月08日
    浏览(46)
  • Linux tail命令详解和高级用法举例

    目            录 一、概述 二、tail命令解释 1.命令格式; 2.功能 3.选项 4.选项的基本用法 (1) 显示行号 (2)忽略指定字符数 (3) 不显示文件名 三.基本功能 1、基本用法 (1) 查看文件末尾内容 (2) 实时监控文件变化 2、高级用法 (1)组合使用1:把一个应用程

    2024年01月16日
    浏览(45)
  • Qt QVector 详解:从底层原理到高级用法

    在计算机编程的世界中,数据结构是一个核心概念,它为我们提供了有效地组织和存储数据的方法。在众多数据结构中,向量(Vector)作为一种动态数组,因其灵活性和高效性受到了广泛的关注。特别是在使用 Qt 框架进行 C++ 编程时,QVector 成为了程序员们的得力工具。 QVe

    2024年02月09日
    浏览(47)
  • python高级技术(进程二)

    会随着主进程的结束而结束。 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children 注意:进程之间是互相独立的,主进程代码运行结束,守护进程随即

    2024年02月04日
    浏览(40)
  • Midjourney用户手册中文版详解模型、命令、参数与高级用法

    最近正在上手体验目前网上很火的 AI 绘画工具 Midjourney,在B 站上找了很多教程来看,现在基本可以上手用它生成很多好玩的图片了。 • Midjourney 入门教程:Midjourney零基础入门指南!小白轻松上手人工智能AI绘画 在逐渐深入使用 Midjourney 的过程中,我发现对很多命令、参数

    2024年02月08日
    浏览(53)
  • Python高级用法:装饰器用于缓存

    缓存装饰器与参数检查十分相似,不过它重点是关注那些内部状态不会影响输出的函数。每组参数都可以链接到唯一的结果。这种编程风格是函数式编程的特点,当输入值有限时可以使用。 因此,缓存装饰器可以将输出与计算它所需要的参数放在一起,并在后续的调用中直接

    2024年01月25日
    浏览(49)
  • 利用Python进行数据清洗与预处理:Pandas的高级用法【第147篇—Pandas的高级用法】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在数据科学和机器学习领域,数据清洗和预处理是至关重要的步骤。Pandas库作为Python中最受欢迎的数据处理工具之一,提供了强大的功能来处

    2024年04月09日
    浏览(108)
  • Midjourney AI绘画中文教程详解(完整版)模型、命令、参数与各种高级用法

    我有一种预感,您一下子看不完这篇内容,您得【收藏】一下,以便下次接着看~~ Midjourney AI绘画中文教程,Midjourney是一款2022年3月面世的AI绘画工具,创始人是David Holz。  只要输入想到的文字,就能通过人工智能产出相对应的图片,耗时只有大约一分钟,这个工具不仅能绘画

    2024年02月06日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包