Python多进程的使用
上篇中讲到多线程的使用,这篇就说说多进程的使用,就目前的情况来看,多进程在某些情况下可以替代多线程来实现多核并行。
首先,在使用多进程前,我们需要了解什么是进程?
进程是资源分配的最小单位,也是线程的容器。在python中,我们是如何使用进程的呢?
import multiprocessing #导入模块 process_obj=multiprocessing.Process(target=目标函数名) #创建一个进程对象 process_obj.start() #启动进程
值得注意的是,进程和线程是完全不一样的,线程可以共享全局变量,而进程则是将主进程的资源copy了一份,所以进程会更消耗资源,它们之间无法进行资源共享,具体会涉及到消息队列,稍后会讲解。
那么使用多进程是否真的比我们多线程更快呢?
import threading import time def run1(): a=1 for i in range(1000000): a+=1 print(a) def run2(): b=1 for i in range(1000000): b+=1 print(b) def main(): start_time=time.perf_counter() t1=threading.Thread(target=run1) t2=threading.Thread(target=run2) t1.start() t2.start() t1.join() t2.join() end_time=time.perf_counter() fina_time=end_time-start_time print(fina_time) if __name__=='__main__': main()
output: 1000000 1000000 0.7437196
这是利用多线程完成的,接下来我们试试利用多进程。
import mulitprocessing import time def run1(): a=0 for i in range(1000000): a+=1 print(a) def run2(): b=0 for i in range(1000000): b+=1 print(b) def main(): start_time=time.perf_counter() proces1=multiprocessing.Process(target=run1) proces2=muitiprocessing.Process(target=run2) proces1.start() proces2.start() proces1.join() proces2.join() end_time=time.perf_counter() fina_time=end_time-start_time print(fina_time) if __name__=='__main__': main()
output: 1000000 1000000 0.643256
这样看来,在这种情况下,多进程确实比多线程占有优势。但在日常生产中,要合理利用多线程以及多进程,实现程序的最高效。
与多线程类似,多进程也拥有守护进程,即主进程结束,子进程也随即结束。
import multiprocessing process_obj=multiprocessing.Process(target=目标函数) process_obj.Daemon(True) #设置守护进程
除此之外,还有一种强制结束子进程的方法。
process_obj.terminate() #强制结束该子进程
既然说道了多进程,那么肯定离不开进程池以及消息队列,还要了解关于同步与异步的工作方式。关于同步与异步、进程池以及消息队列,接下来会继续讲到。
来源:https://www.cnblogs.com/magicdata/p/12298387.html