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方法中调用。
同时,新类中,在重写父类的run方法时,它默认是不带参数的,如果需要给它提供参数,需要在类的构造函数中指定,因为在线程执行的过程中,run方法时线程自己去调用的,不用我们手动调用,所以没法直接给传递参数,只能在构造方法中设定好参数,然后再run方法中调用。
2、multiprocessing模块
线程multiprocessing模块与进程使用的同一模块。使用方法也基本相同,唯一不同的是,from multiprocessing import Pool这样导入的Pool表示的是进程池;
from multiprocessing.dummy 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()