Python多进程

 ̄綄美尐妖づ 提交于 2020-02-12 12:01:59

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()  #强制结束该子进程

既然说道了多进程,那么肯定离不开进程池以及消息队列,还要了解关于同步与异步的工作方式。关于同步与异步、进程池以及消息队列,接下来会继续讲到。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!