zoukankan      html  css  js  c++  java
  • 线程threading和进程multiprocessing模块

    1、线程模块threading

    Python提供了两个有关多线程的标准库,thread和threading。thread提供了低级别的,原始的线程和一个锁。threading则是一个高级模块,提供了对thread的封装。创建新的线程有两种方法:

    Thread类的构造方法:

    __init__(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)
    
    参数说明:
    group:线程组,目前还没有实现,库引用中提示必须是None。
    target:要执行的方法;
    name:线程名;
    args/kwargs:要传入方法的参数。
    

     Thread类拥有的实例方法:

    isAlive():返回线程是否在运行。正在运行指的是启动后,终止前。 
    getName(name)/setName(name):获取/设置线程名。 
    isDaemon(bool)/setDaemon(bool):获取/设置是否为守护线程。初始值从创建该线程的线程继承而来,当没有非守护线程仍在运行时,程序将终止。 
    start():启动线程。
    join([timeout]):阻塞当前上下文环境的线程,直到调用此方法的线程终止或到达指定的等待时间timeout(可选参数)。即当前的线程要等调用join()这个方法的线程执行完,或者是达到规定的时间。
    

    方法一:直接创建threading.Thread类的对象,初始化时将可调用对象作为参数传入。

    注意:

    t = Thread(target = run, args = ("this is a", "thread"))
    这句只是创建了一个线程,并未执行这个线程,此时线程处于新建状态。
    t.start()#启动线程
    启动线程,此时线程仍未运行,只是处于准备状态。
    

     
    方法二:通过继承Thread类,重写它的__init__()方法和run方法。

    由于创建了两个并发执行的线程t1和t2,并发线程的执行时间不定,谁先执行完的时间也不定,所以执行后打印的结果顺序也是不定的。每一次执行都有可能出现不同的结果。

    注意:

    继承Thread类的新类MyThread构造函数中必须要调用父类的构造方法,这样才能产生父类的构造函数中的参数,才能产生线程所需要的参数。新的类中如果需要别的参数,直接在其构造方法中加即可。
    同时,新类中,在重写父类的run方法时,它默认是不带参数的,如果需要给它提供参数,需要在类的构造函数中指定,因为在线程执行的过程中,run方法时线程自己去调用的,不用我们手动调用,所以没法直接给传递参数,只能在构造方法中设定好参数,然后再run方法中调用。

    2、multiprocessing模块

    线程multiprocessing模块与进程使用的同一模块。使用方法也基本相同,唯一不同的是,from multiprocessing import Pool这样导入的Pool表示的是进程池;
    from multiprocessing.dummy import Pool这样导入的Pool表示的是线程池。这样就可以实现线程里面的并发了。
    线程池示例:
    进程池示例:
    from multiprocessing import Pool
    
    def f(x):
        return x*x
    
    if __name__ == '__main__':
        with Pool(5) as p:
            print(p.map(f, [1, 2, 3]))
    
    结果输出:[1, 4, 9]
    

    在multiprocessing中,通过创建Process对象,然后调用其start()方法来生成进程。

    from multiprocessing import Process
    import os
    
    def info(title):
        print(title)
        print('module name:', __name__)
        print('parent process:', os.getppid())
        print('process id:', os.getpid())
    
    def f(name):
        info('function f')
        print('hello', name)
    
    if __name__ == '__main__':
        info('main line')
        p = Process(target=f, args=('bob',))
        p.start()
        p.join()
    
  • 相关阅读:
    Rotate List
    Spiral Matrix II
    Jump Game
    Maximum Subarray
    Pow(x, n)
    Anagrams
    Permutations
    unity 相机的问题
    NGUI 学习
    空间数据库1
  • 原文地址:https://www.cnblogs.com/honey-badger/p/8461390.html
Copyright © 2011-2022 走看看