zoukankan      html  css  js  c++  java
  • Python并发解决方案

    一、subprocess模块

    call():执行命令,返回程序返回码(int)

    import subprocess

    print(subprocess.call("mspaint"))

    check_output():执行命令,返回输出(bytes)

    import subprocess

    import chardet

    output = subprocess.check_output("ipconfig")

    encoding = chardet.detect(output)['encoding']

    print(output.decode(encoding, errors="ignore"))

    二、threading模块

    Thread

    构造函数-参数:

    target: 执行的操作(可调用对象,必选的)

    name: 线程名(字符串,可选的)

    args: 可调用对象需要的参数(位置参数部分,元组)

    kwargs: 可调用对象需要的参数(关键字参数部分,字典)

    from threading import  Thread

    t = Thread(

        target=print,

        args=(1, 2, 3),

        kwargs={'sep': '->', 'end': ' ' * 10}

    )

    t.start()

    方法:

    start(): 启动线程(开始交给CPU执行)

    run():start()启动之后,会被自动调用的方法。(子类可重写)

    join(): 让父级线程等待自己完成(必须要在调用start()之后才能调用)

    属性:

    name:线程名称

    daemon:是否是后台线程(若要设置该值,必须要在调用start()方法之前)

    ident: 线程ID

    Event:

    set(): 设置值为True

    clear(): 设置值为False

    wait(): 等待

    is_set():判断值是否为True

    函数:

    main_thread():得到主线程对象

    active_count():得到活跃线程数目

    current_thread():得到当前所在的线程对象

    enumerate():返回迭代器,得到所有的活跃线程

    关于daemon:

    在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:

    如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;

    如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

    属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。

    另外要注意的是,上面的描述并不适用于IDLE环境中的交互模式或脚本运行模式,因为在该环境中的主线程只有在退出Python IDLE时才终止。

    三、multiprocessing模块

    Process() 创建一个进程对象,构造函数参数如下

    target:要执行的操作(函数)(必须)

    name:进程名(可选)

    args:传递给target的函数执行时需要的位置、可选参数(按位置指定)

    kwargs:传递给target的函数执行时需要的关键字参数(按名称指定)

    进程对象(实例)方法:

    start():启动进程

    run():进程启动后,实际执行的方法,一般重写此方法。

    terminate():强制结束进程

    join():等待所有子进程执行完成

    进程对象(实例)属性:

    name:进程名

    daemon:是否是后台进程

    pid: 进程id

    Pool(),创建一个进程池,构造函数参数(都是可选的)如下:

    numprocess:进程池大小(同时有几个进程在工作)(默认为当前电脑的CPU核心数)

    initializer:每个进程启动时执行的操作(函数)

    initargs:传递给initializer的函数执行需要的参数(元组)

    Pool对象方法:

    执行方法:

    apply(func, args, kwargs):(同步)执行一个。(返回值,func的返回结果)

    apply_async(func, args, kwargs):(异步)执行一个。(返回值:ApplyResult,与AsyncResult类似,需要在进程池中所有任务完成后调用其get()方法取数据)

    map(func,iterable, chunksize):(同步)一次取N个放到进程池中执行(N为进程池大小),等到本次取出的都执行完了再取下一批。(返回值:list,与外部数据顺序一致)

    map_async(func,iterable, chunksize):(异步)一次取N个放到进程池中执行(N为进程池大小),只要进程池中有空闲位置,就取会数据,保证进程池一直是忙碌的。(返回值: AsyncResult,需要在进程池中所有任务完成后调用其get()方法取数据)

    imap(func, iterable, chunksize):与map()类似,返回可迭代对象,返回数据的顺序和外部传递的数据顺序一致。

    imap_unordered(func, iterable, chunksize):与map()类似,但是返回数据的顺序不能确定(当对数据顺序没有要求时使用)。

    进程池管理方法():

    close():关闭进程池,但是会等待池中作业完成

    terminate():停止进程池中的作业,会关闭进程池

    join():等待进程池中所有任务完成(需要先关闭进程池)

    AsyncResult方法:

    get(timeout):timeout可选。获取结果

    ready():判断进程池中任务是否执行完毕。

    successful():判断进程池中任务是否都正常完成了(只要有一个进程出错了,就会返回False)。

    wait(timeout):timeout可选。

    Manager()托管对象。

    dict(): 共享字典

    Event(): 共享事件

    list(): 共享列表

    Value(typecode, value): 共享的单个值

    multiprocessing.dummy.Pool() 线程池:

    from multiprocessing.dummy import Pool as ThreadPool

    pool_size = 4 # 线程池大小

    tpool = ThreadPool(pool_size)  # 创建线程池

    进程池有的方法,线程池都有。 

    获取CPU核心数:

    标准库- multiprocessingimport multiprocessing

    multiprocessing.cpu_count()

    第三方- psutilimport psutil

    psutil.cpu_count()

    注意:Python中的多进程,启动代码需要在if__name__ == "__main__"中,多进程代码,不能在交互式环境中执行,应该使用python xxx.py的方式执行。

    参考:17.2. multiprocessing — Process-based parallelism

    附加:

    numpy

    .mean():求平均值

    .sum(): 求和

    uuid

    uuid4():生成唯一id(UUID类型,可以通过str()转成字符串)

     

    1.         subprocess模块

    2.         threading模块

    3.         multiprocessing模块

     

    一、             subprocess模块

    call():执行命令,返回程序返回码(int

    import subprocess

     

    print(subprocess.call("mspaint"))

     

    check_output():执行命令,返回输出(bytes

    import subprocess

    import chardet

     

    output = subprocess.check_output("ipconfig")

    encoding = chardet.detect(output)['encoding']

    print(output.decode(encoding, errors="ignore"))

     

    二、             threading模块

    Thread

        构造函数-参数:

    n  target: 执行的操作(可调用对象,必选的)

    n  name: 线程名(字符串,可选的)

    n  args: 可调用对象需要的参数(位置参数部分,元组)

    n  kwargs: 可调用对象需要的参数(关键字参数部分,字典)

       

    from threading import  Thread

     

    t = Thread(

        target=print,

        args=(1, 2, 3),

        kwargs={'sep': '->', 'end': ' ' * 10}

    )

     

    t.start()

        方法:

    n  start(): 启动线程(开始交给CPU执行)

    n  run()start()启动之后,会被自动调用的方法。(子类可重写)

    n  join(): 让父级线程等待自己完成(必须要在调用start()之后才能调用)

        属性:

    n  name:线程名称

    n  daemon:是否是后台线程(若要设置该值,必须要在调用start()方法之前)

    n  ident: 线程ID

    Event:

    n  set(): 设置值为True

    n  clear(): 设置值为False

    n  wait(): 等待

    n  is_set():判断值是否为True

    函数:

    n  main_thread():得到主线程对象

    n  active_count():得到活跃线程数目

    n  current_thread():得到当前所在的线程对象

    n  enumerate():返回迭代器,得到所有的活跃线程

    关于daemon

    在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:

    l  如果某个子线程的daemon属性为False,主线程结束时会检测该子线程是否结束,如果该子线程还在运行,则主线程会等待它完成后再退出;

    l  如果某个子线程的daemon属性为True,主线程运行结束时不对这个子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。

    属性daemon的值默认为False,如果需要修改,必须在调用start()方法启动线程之前进行设置。

    另外要注意的是,上面的描述并不适用于IDLE环境中的交互模式或脚本运行模式,因为在该环境中的主线程只有在退出Python IDLE时才终止。

    三、             multiprocessing模块

    Process() 创建一个进程对象,构造函数参数如下

    u  target:要执行的操作(函数)(必须)

    u  name:进程名(可选)

    u  args:传递给target的函数执行时需要的位置、可选参数(按位置指定)

    u  kwargs:传递给target的函数执行时需要的关键字参数(按名称指定)

    进程对象(实例)方法:

    n  start():启动进程

    n  run():进程启动后,实际执行的方法,一般重写此方法。

    n  terminate():强制结束进程

    n  join():等待所有子进程执行完成

    进程对象(实例)属性:

    n  name:进程名

    n  daemon:是否是后台进程

    n  pid: 进程id

    Pool(),创建一个进程池,构造函数参数(都是可选的)如下:

    u  numprocess进程池大小(同时有几个进程在工作)(默认为当前电脑的CPU核心数)

    u  initializer:每个进程启动时执行的操作(函数)

    u  initargs:传递给initializer的函数执行需要的参数(元组)

    Pool对象方法:

             执行方法:

    n  apply(func, args, kwargs):(同步)执行一个。(返回值,func的返回结果)

    n  apply_async(func, args, kwargs):(异步)执行一个。(返回值:ApplyResult,与AsyncResult类似,需要在进程池中所有任务完成后调用其get()方法取数据)

    n  map(func,iterable, chunksize):(同步)一次取N个放到进程池中执行(N为进程池大小),等到本次取出的都执行完了再取下一批。(返回值:list,与外部数据顺序一致)

    n  map_async(func,iterable, chunksize):(异步)一次取N个放到进程池中执行(N为进程池大小),只要进程池中有空闲位置,就取会数据,保证进程池一直是忙碌的。(返回值: AsyncResult,需要在进程池中所有任务完成后调用其get()方法取数据)

    n  imap(func, iterable, chunksize):与map()类似,返回可迭代对象,返回数据的顺序和外部传递的数据顺序一致。

    n  imap_unordered(func, iterable, chunksize):与map()类似,但是返回数据的顺序不能确定(当对数据顺序没有要求时使用)。

             进程池管理方法()

    u  close():关闭进程池,但是会等待池中作业完成

    u  terminate():停止进程池中的作业,会关闭进程池

    u  join():等待进程池中所有任务完成(需要先关闭进程池)

             AsyncResult方法:

    l  get(timeout)timeout可选。获取结果

    l  ready():判断进程池中任务是否执行完毕。

    l  successful():判断进程池中任务是否都正常完成了(只要有一个进程出错了,就会返回False)。

    l  wait(timeout)timeout可选。

    Manager()托管对象。

    n  dict(): 共享字典

    n  Event(): 共享事件

    n  list(): 共享列表

    n  Value(typecode, value): 共享的单个值

    multiprocessing.dummy.Pool() 线程池:

    from multiprocessing.dummy import Pool as ThreadPool

     

    pool_size = 4 # 线程池大小

    tpool = ThreadPool(pool_size)  # 创建线程池

    进程池有的方法,线程池都有。

             获取CPU核心数

    标准库- multiprocessing

    import multiprocessing

     

    multiprocessing.cpu_count()

    第三方- psutil

    import psutil

     

    psutil.cpu_count()

     

    注意:Python中的多进程,启动代码需要在if__name__ == "__main__"中,多进程代码,不能在交互式环境中执行,应该使用python xxx.py的方式执行。

    参考:17.2. multiprocessing — Process-based parallelism

     

    附加:

    numpy

             .mean():求平均值

             .sum(): 求和

    uuid

             uuid4():生成唯一idUUID类型,可以通过str()转成字符串)

  • 相关阅读:
    window.location.href无法跳转的解决办法
    HTTP 错误 405.0
    C# 浅拷贝与深拷贝
    C# .ToString() 格式化
    深入理解AsyncTask
    【转】Android子线程真的不能更新UI么
    深入理解Activity的启动模式
    Android7.0,剪裁后提示“无法保存经过裁剪的图片”
    Android工程改包名
    javah命令,提示“找不到类文件”
  • 原文地址:https://www.cnblogs.com/sxqfuture/p/9982085.html
Copyright © 2011-2022 走看看