Python多进程
Posted magicdata
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python多进程相关的知识,希望对你有一定的参考价值。
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() #强制结束该子进程
既然说道了多进程,那么肯定离不开进程池以及消息队列,还要了解关于同步与异步的工作方式。关于同步与异步、进程池以及消息队列,接下来会继续讲到。
以上是关于Python多进程的主要内容,如果未能解决你的问题,请参考以下文章