Python提供了两个有关多线程的标准库,thread和threading。thread提供了低级别的,原始的线程和一个锁。threading则是一个高级模块,提供了对thread的封装。建立新的线程有两种方法:python
__init__(group=None, target=None, name=None, args=(), kwargs=None, verbose=None)
参数说明: group:线程组,目前尚未实现,库引用中提示必须是None。 target:要执行的方法; name:线程名; args/kwargs:要传入方法的参数。
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,并发线程的执行时间不定,谁先执行完的时间也不定,因此执行后打印的结果顺序也是不定的。每一次执行都有可能出现不一样的结果。this
注意:spa
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()