Python__模块(TIME-进程/线程)__concurrent / multiprocessing

这篇具有很好参考价值的文章主要介绍了Python__模块(TIME-进程/线程)__concurrent / multiprocessing。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

concurrent(简介)

进程或线程的使用。


concurrent(了解)

【线程进程区别】

  • 线程是共享内存空间。

  • 进程是内存独立状态。

同一个进程的线程之间可以直接交流。

两个进程想通信,必须通过一个中间代理来实现。

使用多线程能充分利用 CPU 来提供程序的执行效率。

每一个进程启动时都会最先产生一个线程,即主线程,然后主线程会再创建其他的子线程。

一个进程可包含多个线程。

【同步异步】

同步

提交了一个任务,必须等任务执行完了(拿到返回值),才能执行下一行代码。

相当于执行任务的串行执行。

异步

交了一个任务,无需等执行完,可以直接执行下一行代码。


concurrent(参数列表)

concurrent.futures

模块提供了高度封装的异步调用接口。

ThreadPoolExecutor

线程池,提供异步调用

ProcessPoolExecutor

进程池,提供异步调用

subprocess

子进程操作

result(timeout=None)

取得结果

add_done_callback(fn)

回调函数

submit(fn, *args, **kwargs)

异步提交任务

wait=True

等待池内所有任务执行完毕回收完资源后才继续

wait=False

立即返回,并不会等待池内的任务执行完毕,

但不管wait参数为何值,整个程序都会等到所有任务执行完毕

shutdown(wait=True)

相当于进程池的pool.close()+pool.join()操作

map(func, *iterables, timeout=None, chunksize=1)

取代for循环submit的操作。


concurrent(参考代码)

简单的多线程操作

from concurrent.futures import ThreadPoolExecutor
import time

def task(i):
    print(f"在执行任务{i}")
    print("假设这是一个URL请求的地址....")
    time.sleep(5)

pool = ThreadPoolExecutor(2)  # 4个线程
for i in range(20):
    pool.submit(task, i)

上一个例子的简化版(map)


# 例子-map用法
from concurrent.futures import ThreadPoolExecutor
from threading import Thread, currentThread
import time

def task(i):
    print(f"{currentThread().name} 在执行任务{i}")
    time.sleep(1)

if __name__ == "__main__":
    pool = ThreadPoolExecutor(4)
    pool.map(task, range(0, 20))  # map取代了for+submit

multiprocessing(简介)

进程的进阶用法。


multiprocessing(了解)

multiprocessing-模块用来开启子进程。

功能:支持子进程,通信和共享数据,执行不同执行的同步。

提供->Process,Queue,Pipe,Lock等组件。


multiprocessing(参数列表)

Process类

由该类实例化得到的对象,可用来开启一个子进程。

【语法】 Process([group [, target [, name [, args [, kwargs]]]]])

group  (暂时忽略) 参数未使用,值始终为None。

target (函数) 表示调用对象,即子进程要执行的任务。

args   (函数的参数) 表示调用对象的位置参数元组,args=(1,2,'mike')。

kwargs (暂时忽略) 表示调用对象的字典,kwargs={'name':'mike','age':'18'}。

常用函数

start()

(启动进程)调用该子进程中的run()

run()

(进程启动时运行的方法)正是它去调用target指定的函数。

terminate()

(强制终止进程),不会进行任何清理操作,如果创建了子进程,

该子进程就成了僵尸进程,使用该方法需要特别小心这种情况,

如果还保存了一个锁那么也将不会被释放,进而导致死锁。

is_alive()

进程仍然运行,返回True。

join([timeout])

主进程等待终止(主进程处于等的状态)

daemon

默认值为False,如果设为True,代表子进程为后台运行的守护进程,

父进程终止时,子进程也随之终止,并且设定为True后。

name

进程的名称

pid

进程的pid文章来源地址https://www.toymoban.com/news/detail-767474.html


multiprocessing(参考代码)

单进程

import multiprocessing
import time

def func(msg):
    for i in range(20):
        print(msg, i)
        time.sleep(1)

if __name__ == "__main__":
    p = multiprocessing.Process(target=func, args=("input content....",))
    p.start()
    p.join()

    print("Sub-process done.")

多进程

import multiprocessing
import time

def fc1(msg):
    for i in range(3):
        print("{}:黄岛主 正在进行任务{}....".format(msg, i + 1))
        time.sleep(1)
    print(">>>>>> {}大佬 任务完成".format(msg))


def fc2(msg):
    for i in range(2):
        print("{}:欧阳锋 正在进行任务{}....".format(msg, i + 1))
        time.sleep(1)
    print(">>>>>> {}大佬 任务完成".format(msg))


def fc3(msg):
    for i in range(5):
        print("{}:段大师 正在进行任务{}....".format(msg, i + 1))
        time.sleep(1)
    print(">>>>>> {}大佬 任务完成".format(msg))


def fc4(msg):
    for i in range(2):
        print("{}:洪七公 正在进行任务{}....".format(msg, i + 1))
        time.sleep(1)
    print(">>>>>> {}大佬 任务完成".format(msg))


if __name__ == "__main__":
    pool = multiprocessing.Pool(processes=4)  # CPU核数
    result = []
    person = ["东邪", "西毒", "南帝", "北丐"]
    result.append(pool.apply_async(fc1, (person[0],)))
    result.append(pool.apply_async(fc2, (person[1],)))
    result.append(pool.apply_async(fc3, (person[2],)))
    result.append(pool.apply_async(fc4, (person[3],)))
    pool.close()
    pool.join()
    print("全部OK....")

多线程队列

import multiprocessing as mp

def job(x):
    res = 0
    for i in range(4):
        res += i
    x.put(res)

if __name__ == "__main__":
    # 定义一个多线程队列,用来存储结果
    q = mp.Queue()
    # 定义两个线程函数,用来处理同一个任务
    # Process / Thread
    p1 = mp.Process(target=job, args=(q,))
    p2 = mp.Process(target=job, args=(q,))
    # 分别启动、连接两个线程
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    fc1 = q.get()
    fc2 = q.get()
    print(fc1 + fc2)

进程锁

# 防止不同进程之间抢占共享资源
import multiprocessing as mp
import time

def job(v, num, l):
    l.acquire()  # 锁住
    for _ in range(5):
        time.sleep(1)
        v.value += num  # 获取共享内存
        print("value=", v.value)
    l.release()  # 释放

def multicore():
    lock = mp.Lock()  # 定义一个进程锁
    value = mp.Value("i", 20)  # 定义共享内存
    p1 = mp.Process(target=job, args=(value, 1, lock))  # 需要将lock传入
    p2 = mp.Process(target=job, args=(value, 3, lock))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

if __name__ == "__main__":
    multicore()

到了这里,关于Python__模块(TIME-进程/线程)__concurrent / multiprocessing的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程

    monado系列文章索引汇总: openxr runtime Monado 源码解析 源码分析:源码编译 准备工作说明 hello_xr解读 openxr runtime Monado 源码解析 源码分析:整体介绍 模块架构 模块作用 进程 线程模型 整体流程 openxr runtime Monado 源码解析 源码分析:CreateInstance流程(设备系统和合成器系统)C

    2024年02月11日
    浏览(68)
  • python工具模块介绍-time 时间访问和转换

    功能:时间访问和转换。 相关模块: datetime 标准模块。 calendar 标准模块。 下面介绍一些术语和约定: epoch 是时间开始点。对于Unix ,时代是1970年1月1日0点。通过time.gmtime(0)可以查看时间的起点: 对于32位的linux系统,时间只能处理到2038年。现在新发布的主流已经全部是64位

    2023年04月24日
    浏览(79)
  • Python爬虫:单线程、多线程、多进程

    在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的

    2024年02月13日
    浏览(29)
  • 【python】13.进程和线程

    今天我们使用的计算机早已进入多CPU或多核时代,而我们使用的操作系统都是支持“多任务”的操作系统,这使得我们可以同时运行多个程序,也可以将一个程序分解为若干个相对独立的子任务,让多个子任务并发的执行,从而缩短程序的执行时间,同时也让用户获得更好的

    2024年01月17日
    浏览(31)
  • 【Python】多线程编程 ① ( 线程相关概念 | 进程 | 线程 | 协程 / 纤程 | 管程 )

    进程 与 操作系统 : 进程 是 操作系统 中 能够独立运行的单元 , 是 操作系统 对 正在运行的 应用程序 的 抽象结构 描述 ; 操作系统 中 运行的每个 应用程序 就是一个进程 ; 一个操作系统中可以运行 多个 进程 ; 每个 应用程序 都会被 操作系统 分配一个 进程 ID ; 多个进程之间

    2024年02月15日
    浏览(27)
  • Python小姿势 - 线程和进程:

    线程和进程: Python里面线程是真正的并行执行,进程是可以并行执行的。 所谓进程,就是操作系统中执行一个程序的独立单元,它是系统进行资源分配和调度的基本单位。一个进程可以创建和撤销另一个进程,同一个进程内可以并发执行多个不同的子程序。 所谓线程,是进

    2024年02月01日
    浏览(32)
  • Jmeter系列-并发线程Concurrency Thread Group的介绍(7)

    Concurrency Thread Group提供了用于配置多个线程计划的简化方法,该线程组目的是为了保持并发水平,意味着如果并发线程不够,则在运行线程中启动额外的线程 Concurrency Thread Group提供了更好的用户行为模拟,因为它使您可以更轻松地控制测试的时间,并创建替换线程以防线程在

    2024年02月07日
    浏览(32)
  • 8.0 Python 使用进程与线程

    python 进程与线程是并发编程的两种常见方式。进程是操作系统中的一个基本概念,表示程序在操作系统中的一次执行过程,拥有独立的地址空间、资源、优先级等属性。线程是进程中的一条执行路径,可以看做是轻量级的进程,与同一个进程中的其他线程共享相同的地址空间

    2024年02月13日
    浏览(30)
  • python多进程与多线程

    1.1 GIL 全局解释器锁 其他语言,CPU是多核时是支持多个线程同时执行。但在Python中,无论是单核还是多核,同时只能由一个线程在执行。其根源是GIL的存在。GIL的全称是Global Interpreter Lock(全局解释器锁),来源是Python设计之初的考虑,为了数据安全所做的决定。某个线程想要执

    2024年02月05日
    浏览(32)
  • Python多任务教程:进程、线程、协程

    进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。进程一般由程序、数据集合和进程控制块三部分组成。程序用于描述进

    2024年02月12日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包