进程与线程
1.定义
进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。
线程是进程的一个实体,是CPU调度和分配的基本单位,它是比进程更小的能独立运行的基本单位,线程自己基本上不拥有系统资源,它可以同属于一个进程的其他线程共享进程所拥有的全部资源。
2.关系
一个线程可以创建和撤销另一个线程,同一个进程之间的多个线程可以并发执行。
3.区别
进程和线程的主要差别在于他们是不同的操作系统资源管理方式。进程拥有独立的地址空间,一个进程崩溃后,在保护模式下不会对其他进程产生影响,而线程只是进程中的不同执行路径。线程又自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但是在切换时,耗费资源较大,效率要差一些。
一.Process(用于创建进程):通过创建一个Process对象然后调用它的start()方法来生成进程。
from multiprocessing import Process # 导入需要的模块
import os
# 定义进程要执行的任务
def run_proc(name):
print("子进程的进程号为 %s (%s)..." %(name, os.getppid())) # os.getppid()获取当前进程的进程号
if __name__ == '__main__':
print("父进程的进程号为 %s " % os.getppid()) # 获取当前父类进程的进程号
p = Process(target=run_proc, args=("1")) # 实例化进程
print("子进程将要启动...")
p.start()
p.join()
print("子进程结束...")
二.Pool(用于创建进程管理池):可以创建一个进程池,该进程将执行与Pool该类一起提交给它的任务,当子进程较多需要管理时使用。
from multiprocessing import Pool # 引入进程池
import os,time,random
def long_time_task(name):
print("子进程运行进程号 %s (%s)..."%(name,os.getppid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print("任务%s运行时间%0.2f seconds" %(name,(end-start)))
if __name__ == '__main__':
print("父进程运行进程号 %s" % os.getppid())
p = Pool(2)
for i in range(5):
p.apply_async(long_time_task, args=(i,))
print("等待所有子进程开始...")
p.close()
p.join()
print("所有进程执行完毕...")
# 在此次任务中,设置进程池的数量为4个,这样在执行任务的时候
# 会先执行前面4个任务,第5个任务需要等前面4个的任务执行完毕
# 之后才会执行下一轮的任务。
三.Queue(用于进程通信,资源共享):进程间通信,保证进程安全。
# 进程间通信,以Queue为例,在父进程中创建两个子进程,一个网Queue里写数据,
# 一个从Queue里读取数据
from multiprocessing import Process,Queue
import os,time,random
# 写数据进程执行的代码
def write(q):
print("Process to write: %s" % os.getppid())
for value in ["A","B","C"]:
print("Put %s to queue..." % value)
q.put(value)
time.sleep(random.random())
# 读数据进程执行的代码
def read(q):
print("Process to read :%s" % os.getppid())
while True:
value = q.get(True)
print("Get %s from queue" % value)
if __name__ == '__main__':
q = Queue() # 通过父进程创建Queue,并传递给各个子进程
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
pw.start() # 启动子进程,写入
pr.start() # 启动子进程,读取
pw.join() # 等待pw结束
pr.terminate() # pr进程是死循环,无法等待期结束,只能强行停止
网友评论