美文网首页
Python的进程线程和协程

Python的进程线程和协程

作者: Donald_32e5 | 来源:发表于2019-03-29 18:17 被阅读0次

进程是CPU资源分配和调度的独立单位
线程是CPU最小的执行单元
协程是程序根据自己的需求来进行调度的

一、进程

(1)编写多进程一般使用跨平台版本的模块 multiprocessing,它提供了对进程的一系列操作

from multiprocessing import Process

//进程要执行的代码
def say(name):
    print("%s say hello"%name)


if __name__="__main__":
p = Process(target=say,args=("laowang",)
p.start
p.join
p.close

(2)如果需要多个进程,就可以使用进程池Pool

(3)进程间的通讯,因为不是同一个上下文环境,需要先对数据进行pickle序列化,然后可以使用Queue、Pipes进行数据的传递

# 在父进程中创建两个子进程
# 初始化通信队列
# 定义两个函数,一个从队列里消费数据,一个生产数据。也就是一个简单的生产者消费者模型了
from multiprocessing import Process, Queue

def write(q):
    for value in ["a","b","c"]:
        q.put(value)

def read(q):
    while True:
        value = q.get()

if __name__ ="__main__":
    q = Queue()
    pw = Process(target=write,args=(q,))
    pr = Process(target=read,args=(q,))
    pw.start()
    pr.start()
    pw.join()
    pr.terminate()

(4)由于多进程通信部不是很方便,多任务也可以使用多进程完成任务 也可以使用多线程完成任务

(5) 进程 是由若干线程组成的,一个进程至少有一个线程

二、线程

(1)python的标准库提供了两个多线程模块:_threading、threading

  • _threading是普通库,threading是高级模块,对_threading进行了封装
import threading

def look():
    for i in range(100):
    
        print(i)
    
if __name__="__main__":
    t = threading.Thread(target=look,name='look_this') #如果函数有参数,也是使用args接收一个元祖, 自定义进程的名字,可以不设置,默认thread1、thread2.....
t.start()
t.join()

(2)多线程和多进程最大的不同在于

  • 多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响.

  • 而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改

  • 因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了

  • 这时候就需要一把锁了,用来锁住当前执行的线程。

  • 创建一个锁 可以使用threading.Lock来完成

lock = threading.Lock()

def run_thread(n):
    for i in range(100000):
        # 先要获取锁:
        lock.acquire()
        try:
            # 放心地改吧:
            print(n)
        finally:
            # 改完了一定要释放锁:
            lock.release()
  • Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先获得GIL锁

  • 然后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把所有线程的执行代码都给上了锁。

  • 多线程在Python中只能交替执行,即使100个线程跑在100核CPU上,也只能用到1个核

  • Python虽然不能利用多线程实现多核任务,但可以通过多进程实现多核任务,当然也可以使用协程来完成

  • 多个Python进程有各自独立的GIL锁,互不影响。

  • Python解释器由于设计时有GIL全局锁,导致了多线程无法利用多核。多线程的并发在Python中就是一个美丽的梦。

相关文章

  • Python 线程和进程和协程总结

    Python 线程和进程和协程总结 线程和进程和协程 进程 进程是程序执行时的一个实例,是担当分配系统资源(CPU...

  • Python多线程、多进程和协程的实例讲解

    线程、进程和协程是什么 线程、进程和协程的详细概念解释和原理剖析不是本文的重点,本文重点讲述在Python中怎样实...

  • 多进程与多线程与协程

    python的进程线程和协程:https://www.cnblogs.com/zhang-can/p/721550...

  • 对比python的计算密集型单线程和多线程

    python的并发有三种方式:线程,进程和协程。今天记录下python多线程和单线程对比结果,当然这里测试的时计算...

  • Python中的并发

    Python实现并发现在主要有三种方式:进程、线程和协程 本文先主要讲述进程和线程,由于之前写过有关进程和线程的文...

  • Python的进程线程和协程

    进程是CPU资源分配和调度的独立单位线程是CPU最小的执行单元协程是程序根据自己的需求来进行调度的 一、进程 (1...

  • python中进程,线程和协程

    进程:资源分配的最小单位线程:任务分配的最小单位协程:用户模式下轻量级的线程,系统不管这部分的调度 多进程 全局变...

  • Python线程、进程和协程详解

    Python被人诟病最多的大概就是性能差,在这里讲一下 Python 的多进程,多线程与协程。首先声明这不是教程,...

  • 进程、线程和协程

    概念 介绍 1.进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一...

  • 进程、线程和协程

    一、进程 1、多任务原理 多任务是指操作系统同时可以运行多个任务。 单核CPU实现多任务原理:操作系统轮流让各个任...

网友评论

      本文标题:Python的进程线程和协程

      本文链接:https://www.haomeiwen.com/subject/boqrbqtx.html