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()转成字符串)

  • 相关阅读:
    uva 10369 Arctic Network
    uvalive 5834 Genghis Khan The Conqueror
    uvalive 4848 Tour Belt
    uvalive 4960 Sensor Network
    codeforces 798c Mike And Gcd Problem
    codeforces 796c Bank Hacking
    codeforces 768c Jon Snow And His Favourite Number
    hdu 1114 Piggy-Bank
    poj 1276 Cash Machine
    bzoj 2423 最长公共子序列
  • 原文地址:https://www.cnblogs.com/sxqfuture/p/9982085.html
Copyright © 2011-2022 走看看