有关进程、线程、多进程、多线程
线程与进程
概念
线程:是程序执行流的最小单元,是系统独立调度和分配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()之后调用
---------------------
网友评论