python多进程与多线程!
有关进程、线程、多进程、多线程 线程与进程 概念 线程:是程序执行流的最小单元,是系统独立调度和分配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()之后调用 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |