美文网首页Python新世界
python多进程与多线程!

python多进程与多线程!

作者: 919b0c54458f | 来源:发表于2018-12-14 10:31 被阅读5次

    有关进程、线程、多进程、多线程

    线程与进程

    概念

    线程:是程序执行流的最小单元,是系统独立调度和分配CPU(独立运行)的基本单位。

    进程:是资源分配的基本单位。一个进程包括多个线程。

    区别

    1.线程与资源分配无关,它属于某一个进程,并与进程内的其他线程一起共享进程的资源。

    2.每个进程都有自己一套独立的资源(数据),供其内的所有线程共享。

    3.不论是大小,开销线程要更“轻量级”

    4.一个进程内的线程通信比进程之间的通信更快速,有效。(因为共享变量)

    多线程与多进程

    多线程:同一时刻执行多个线程。用浏览器一边下载,一边听歌,一边看视频,一边看网页。

    多进程:同时执行多个程序。如,同时运行YY,QQ,以及各种浏览器。

    并发与并行

    并发当有多个线程在操作时,如果系统只有一个CPU,则它根本不可能真正同时进行一个以上的线程,它只能把CPU运行时间划分成若干个时间段,再将时间 段分配给各个线程执行,在一个时间段的线程代码运行时,其它线程处于挂起状。.这种方式我们称之为并发(Concurrent)。

    并行:当系统有一个以上CPU时,则线程的操作有可能非并发。当一个CPU执行一个线程时,另一个CPU可以执行另一个线程,两个线程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。

    更多的解释

    请参考博客园

    python开启多线程、多进程

    使用threading模块开启多线程

    Thread类是threading模块中最重要也是最基本的一个类,它支持使用两种方法来创建线程,一种方法是为构造函数传递一个可调用对象,同时可以传递参数,只不过要求参数必须为元组形式;另一种方法是继承Thread类并在派生类中重写__init__()和run()方法。创建线程对象以后,可以调用其start()方法来启动,该方法自动调用该类对象的run()方法。比如

    import threading

    def func1(x):

    while x:

    print(x)

    x = x -1

    threading.Thread(target=func1,args=(5,)).start()

    1

    2

    3

    4

    5

    6

    Thread对象的daemon属性

    当某子线程的daemon属性为True时主线程运行结束时不对子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,无论是否运行完成。daemon属性的默认值为False,如需修改,则必须在调用start()方法启动线程之前修改。

    使用_thread模块(不推荐)

    比如上面的代码可改为

    import _thread

    import time

    def func1(x):

    while x:

    print(x)

    x = x -1

    _thread.start_new_thread(func1,(5,))

    time.sleep(6)

    进群:960410445   即可获取数十套PDF!

    这里为了防止主线程结束时子线程还未运行完成,阻塞了主线程6s

    python开启多进程

    与使用threading模块中的Thread对象创建和启动线程类似,可以通过multiprocessing模块中的Process对象来创建和启动进程。比如

    from multiprocessing import Process

    import os

    def f(name):

    print('module name:',__name__)

    print('parent process id',os.getppid())

    print('this process id',os.getpid())

    print('this process name',name)

    if __name__ =='__main__':

    p=Process(target=f,args=('ins',))

    p.start()

    如果要考虑建立多个子进程可以使用multiprocessing.Pool类。该类可以创建一个进程池,然后在多个核上执行这些进程。例如:

    import multiprocessing

    import time

    def func(msg):

    print(multiprocessing.current_process().name + '-' + msg )

    #使进程阻塞3s,不然进程执行太快,一个进程就瞬间完执行所有的任务

    #这样的话,上面打印的进程名是同一个,出现伪多进程的错觉

    time.sleep(3)

    if __name__ == "__main__":

    pool = multiprocessing.Pool(processes=4) # 创建4个进程

    for i in range(3):

    msg = "hello %d" %(i)

    pool.apply_async(func, (msg, ))

    #当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;

    # 但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它

    pool.close() # 关闭进程池,表示不能在往进程池中添加进程

    pool.join() # 等待进程池中的所有进程执行完毕,必须在close()之后调用

    ---------------------

    相关文章

      网友评论

        本文标题:python多进程与多线程!

        本文链接:https://www.haomeiwen.com/subject/jupwhqtx.html