码迷,mamicode.com
首页 > 编程语言 > 详细

线程threading和进程multiprocessing模块

时间:2018-02-23 13:28:26      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:必须   code   说明   ppi   fun   func   ali   表示   print   

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()

 

线程threading和进程multiprocessing模块

标签:必须   code   说明   ppi   fun   func   ali   表示   print   

原文地址:https://www.cnblogs.com/honey-badger/p/8461390.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!