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多进程的主要内容,如果未能解决你的问题,请参考以下文章

[Python3] 043 多线程 简介

python中的多线程和多进程编程

代码片段:Shell脚本实现重复执行和多进程

线程学习知识点总结

什么是多线程,多进程?

多线程编程