多进程和多线程

Posted _雪辉_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了多进程和多线程相关的知识,希望对你有一定的参考价值。

一、进程与线程

  • 进程是指在系统中正在运行的一个应用程序,每个进程之间是独立的,每个进程均运行在其专用的且受保护的内存
  • 线程是进程的基本执行单元,一个进程的所有任务都在线程中执行,程序启动会默认开启一条线程,这条线程被称为主线程或 UI 线程
  • 线程是处理器调度的基本单位,但是进程不是
    地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
    资源共享:同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的
      一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。进程切换时,消耗的资源大,效率高。所以涉及到频繁的切换时,使用线程要好于进程。同样如果要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程
    执行过程。

二、多进程与多线程

多进程

  • 优点

可以并行的执行多个任务,提高运行效率
空间独立,数据安全,创建方便

  • 缺点

进程的创建和销毁过程需要消耗较多的计算机资源,
在需要频繁创建和删除较多进程的情况下,资源消耗过多,不适宜使用多进程完成任务;

多线程

  • 优点

能提高程序的执行效率
能提高资源的利用率(CPU,内存)
线程上的任务执行完成后,线程会自动销毁

  • 缺点

开启线程需要占用一定的内存空间(默认情况下,每一个线程都占 512 KB)
如果开启大量的线程,会占用大量的内存空间,降低程序的性能
线程越多,CPU 在调用线程上的开销就越大
程序设计更加复杂,比如线程间的通信、多线程的数据共享

三、python多进程与多线程

  Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁,然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁,所以,多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核。Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。

多进程

#!/usr/bin/python3

from multiprocessing import Pool
import os, time, random
import threadpool
def long_time_task(name,i):
    print('任务 %s (%s)...' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random() * 3)
    end = time.time()
    print('任务 %s 运行 %0.2f seconds.' % (name, (end - start)))
    print('%s%s' % (name,i))

if __name__=='__main__':
    print('进程 %s.' % os.getpid())
    p = Pool(4)
    for i in range(10):
        name = "xuehui"
        p.apply_async(long_time_task, args=(name,i))
    print('等待子进程完成')
    p.close()
    p.join()
    print('所有子进程完')
进程 24554.
等待子进程完成
任务 xuehui (24556)...
任务 xuehui (24557)...
任务 xuehui (24558)...
任务 xuehui (24555)...
任务 xuehui 运行 1.57 seconds.
xuehui1
任务 xuehui (24557)...
任务 xuehui 运行 1.68 seconds.
xuehui3
任务 xuehui (24555)...
任务 xuehui 运行 0.37 seconds.
xuehui4
任务 xuehui (24557)...
任务 xuehui 运行 2.26 seconds.
xuehui0
任务 xuehui (24556)...
任务 xuehui 运行 0.24 seconds.
xuehui7
任务 xuehui (24556)...
任务 xuehui 运行 2.76 seconds.
xuehui2
任务 xuehui (24558)...
任务 xuehui 运行 0.77 seconds.
xuehui9
任务 xuehui 运行 1.81 seconds.
xuehui6
任务 xuehui 运行 2.54 seconds.
xuehui5
任务 xuehui 运行 2.09 seconds.
xuehui8
所有子进程完

多线程

import time
import threading
import os

# 新线程执行的代码:
def loop():
    print (threading.current_thread().name + str(os.getpid()))
    n = 0
    while n < 5:
        n = n + 1
        print (threading.current_thread().name + str(os.getpid())+ " >>>" + str(n) )
        time.sleep(1)
    print (threading.current_thread().name+"结束")

print (threading.current_thread().name +"正在运行")
t = threading.Thread(target=loop, name='LoopThread')
t.start()
t.join()
print (threading.current_thread().name+"结束")
MainThread正在运行
LoopThread24510
LoopThread24510 >>>1
LoopThread24510 >>>2
LoopThread24510 >>>3
LoopThread24510 >>>4
LoopThread24510 >>>5
LoopThread结束
MainThread结束

以上是关于多进程和多线程的主要内容,如果未能解决你的问题,请参考以下文章

什么是多线程,多进程?

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

多线程和多进程的区别

python 多进程和多线程配合

Python多线程和多进程谁更快?

多线程和多进程通信原理