> 백엔드 개발 > 파이썬 튜토리얼 > Python 다중 프로세스 지식 포인트 요약

Python 다중 프로세스 지식 포인트 요약

WBOY
풀어 주다: 2022-05-17 21:01:57
앞으로
2440명이 탐색했습니다.

이 기사에서는 다중 프로세스란 무엇인지, 프로세스 생성, 프로세스 간 동기화, 프로세스 풀 등 다중 프로세스에 대한 관련 내용을 주로 소개하는 python에 대한 관련 지식을 제공합니다. 보세요, 모두에게 도움이 되길 바랍니다.

Python 다중 프로세스 지식 포인트 요약

추천 학습: python 비디오 튜토리얼

1. 다중 프로세스란 무엇입니까?

1. Process

Program: 예를 들어 xxx.py는 정적

Process인 프로그램입니다. 프로그램이 실행된 후 사용된 코드와 리소스를 프로세스라고 합니다. 운영 시스템 자원 할당의 기본 단위입니다. 스레드를 통해 멀티태스킹을 완료할 수 있을 뿐만 아니라 프로세스도 사용할 수 있습니다

2. 프로세스 상태

작업 중에는 작업 수가 CPU 코어 수보다 많은 경우가 많습니다. 즉, 일부 작업을 실행해야 합니다. , 다른 작업은 CPU가 실행되기를 기다리고 있으므로 상태가 달라집니다
Python 다중 프로세스 지식 포인트 요약

  • Ready state: 실행 조건이 느려지고 CPU가 실행되기를 기다리고 있습니다
  • Execution state: CPU가 기능을 실행 중입니다
  • Waiting state : 프로그램이 Sleeping되는 등 특정 조건이 충족되기를 기다리는 중입니다. 현재는 대기 상태입니다.

2. 프로세스 생성 - 다중 처리

1. 구문 설명

다중 처리 모듈 통과 Process 객체를 생성하고 해당 start() 메서드를 호출하여 프로세스 Process와 <code>threading.Thread API는 동일합니다. multiprocessing 模块通过创建一个 Process 对象然后调用它的 start()方法来生成进程,Processthreading.Thread API 相同。

语法格式multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)

参数说明

  • group:指定进程组,大多数情况下用不到
  • target:如果传递了函数的引用,可以任务这个子进程就执行这里的代码
  • name:给进程设定一个名字,可以不设定
  • args:给target指定的函数传递的参数,以元组的方式传递
  • kwargs:给target指定的函数传递命名参数

multiprocessing.Process 对象具有如下方法和属性:

: multiprocessing.Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
方法名/属性 说明
run() 进程具体执行的方法
start() 启动子进程实例(创建子进程)
join([timeout]) 如果可选参数 timeout 是默认值 None,则将阻塞至调用 join() 方法的进程终止;如果 timeout 是一个正数,则最多会阻塞 timeout 秒
name 当前进程的别名,默认为Process-N,N为从1开始递增的整数
pid 当前进程的pid(进程号)
is_alive() 判断进程子进程是否还在活着
exitcode 子进程的退出代码
daemon 进程的守护标志,是一个布尔值。
authkey 进程的身份验证密钥。
sentinel 系统对象的数字句柄,当进程结束时将变为 ready。
terminate() 不管任务是否完成,立即终止子进程
kill() 与 terminate() 相同,但在 Unix 上使用 SIGKILL 信号。
close() 구문 형식
매개변수 설명🎜: 🎜🎜🎜group: 대부분의 경우 사용되지 않는 프로세스 그룹을 지정합니다. 🎜🎜target: 함수 참조가 전달되면 작업은 다음과 같습니다. 이 하위 프로세스는 여기에서 코드를 실행합니다🎜🎜name: 프로세스의 이름을 설정합니다. 설정할 필요가 없습니다.🎜🎜args: 전달된 매개변수 대상이 지정한 함수에 튜플로 전달됨 🎜🎜kwargs: 대상 🎜🎜🎜🎜multiprocessing.Process 객체가 지정한 함수에 명명된 매개변수 전달에는 다음과 같은 메서드와 속성이 있습니다. 🎜🎜 🎜🎜run( )🎜🎜프로세스별 실행 방법 🎜🎜🎜start()🎜🎜하위 프로세스 인스턴스 시작(하위 프로세스 생성) 🎜🎜🎜join([timeout])🎜 🎜선택적 매개변수인 timeout이 기본값인 None인 경우, Join() 메서드를 호출하는 프로세스가 종료될 때까지 차단됩니다. timeout이 양수인 경우 최대로 차단됩니다. 시간 초과 초🎜🎜🎜name🎜🎜현재 프로세스의 별칭, 기본값은 Process-N, N은 1🎜🎜🎜pid에서 증가하는 정수입니다. 🎜🎜현재 프로세스의 pid(프로세스 번호)🎜🎜🎜is_alive()🎜🎜프로세스의 하위 프로세스가 아직 살아 있는지 확인🎜🎜 🎜exitcode🎜🎜하위 프로세스의 종료 코드🎜🎜🎜daemon🎜🎜프로세스의 데몬 플래그는 부울 값입니다. 🎜🎜🎜authkey🎜🎜프로세스의 인증 키입니다. 🎜🎜🎜sentinel🎜🎜프로세스가 끝나면 준비되는 시스템 개체의 숫자 핸들입니다. 🎜🎜🎜terminate()🎜🎜작업 완료 여부에 관계없이 하위 프로세스를 즉시 종료합니다.🎜🎜🎜kill()🎜🎜동일 종결() , 그러나 Unix에서는 SIGKILL 신호를 사용합니다. 🎜🎜🎜close()🎜🎜Process 객체를 닫고 이와 관련된 모든 리소스를 해제합니다🎜🎜🎜🎜

2. 두 개의 while 루프가 함께 실행됩니다.

# -*- coding:utf-8 -*-from multiprocessing import Processimport timedef run_proc():
    """子进程要执行的代码"""
    while True:
        print("----2----")
        time.sleep(1)if __name__=='__main__':
    p = Process(target=run_proc)
    p.start()
    while True:
        print("----1----")
        time.sleep(1)
로그인 후 복사

작업 결과:
Python 다중 프로세스 지식 포인트 요약
지침: 하위 프로세스를 생성할 때 를 생성하려면 실행 함수와 함수의 매개변수만 전달하면 됩니다. 프로세스 인스턴스, start() 메소드를 사용하여 시작

Process实例,用start()方法启动

3. 进程pid

# -*- coding:utf-8 -*-from multiprocessing import Processimport osimport timedef run_proc():
    """子进程要执行的代码"""
    print('子进程运行中,pid=%d...' % os.getpid())  # os.getpid获取当前进程的进程号
    print('子进程将要结束...')if __name__ == '__main__':
    print('父进程pid: %d' % os.getpid())  # os.getpid获取当前进程的进程号
    p = Process(target=run_proc)
    p.start()
로그인 후 복사

运行结果:
Python 다중 프로세스 지식 포인트 요약

4. 给子进程指定的函数传递参数

# -*- coding:utf-8 -*-from multiprocessing import Processimport osfrom time import sleepdef run_proc(name, age, **kwargs):
    for i in range(10):
        print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
        print(kwargs)
        sleep(0.2)if __name__=='__main__':
    p = Process(target=run_proc, args=('test',18), kwargs={"m":20})
    p.start()
    sleep(1)  # 1秒中之后,立即结束子进程
    p.terminate()
    p.join()
로그인 후 복사

运行结果:
Python 다중 프로세스 지식 포인트 요약

5. 进程间不同享全局变量

# -*- coding:utf-8 -*-from multiprocessing import Processimport osimport time

nums = [11, 22]def work1():
    """子进程要执行的代码"""
    print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))
    for i in range(3):
        nums.append(i)
        time.sleep(1)
        print("in process1 pid=%d ,nums=%s" % (os.getpid(), nums))def work2():
    """子进程要执行的代码"""
    print("in process2 pid=%d ,nums=%s" % (os.getpid(), nums))if __name__ == '__main__':
    p1 = Process(target=work1)
    p1.start()
    p1.join()

    p2 = Process(target=work2)
    p2.start()
로그인 후 복사

运行结果:

in process1 pid=11349 ,nums=[11, 22]in process1 pid=11349 ,nums=[11, 22, 0]in process1 pid=11349 ,
nums=[11, 22, 0, 1]in process1 pid=11349 ,nums=[11, 22, 0, 1, 2]in process2 pid=11350 ,nums=[11, 22]
로그인 후 복사

三、进程间同步-Queue

Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。

1. Queue类语法说明

메서드 이름/속성 설명
#coding=utf-8from multiprocessing import Queue
q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息q.put("消息1") q.put("消息2")print(q.full())  #Falseq.put("消息3")print(q.full()) #True#因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常try:
    q.put("消息4",True,2)except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())try:
    q.put_nowait("消息4")except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())#推荐的方式,先判断消息列队是否已满,再写入if not q.full():
    q.put_nowait("消息4")#读取消息时,先判断消息列队是否为空,再读取if not q.empty():
    for i in range(q.qsize()):
        print(q.get_nowait())
로그인 후 복사
로그인 후 복사
여기에 그림 설명 삽입4. 하위 프로세스가 지정한 함수에 매개변수 전달
FalseTrue消息列队已满,现有消息数量:3消息列队已满,现有消息数量:3消息1消息2消息3
로그인 후 복사
로그인 후 복사
方法名 说明
q=Queue() 初始化Queue()对象,若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头)
Queue.qsize() 返回当前队列包含的消息数量
Queue.empty() 如果队列为空,返回True,反之False
Queue.full() 如果队列满了,返回True,反之False
Queue.get([block[, timeout]]) 获取队列中的一条消息,然后将其从列队中移除,block默认值为True。1、如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出"Queue.Empty"异常。2、如果block值为False,消息列队如果为空,则会立刻抛出"Queue.Empty"异常
Queue.get_nowait() 相当Queue.get(False)
Queue.put(item,[block[, timeout]]) 将item消息写入队列,block默认值为True。1、如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出"Queue.Full"异常。 2、如果block值为False,消息列队如果没有空间可写入,则会立刻抛出"Queue.Full"异常
Queue.put_nowait(item)3. 프로세스 pid 실행 결과:
실행 중 결과:🎜여기에 사진 설명 삽입🎜5 . 전역 변수는 프로세스 간에 공유되지 않습니다🎜
from multiprocessing import Process, Queueimport os, time, random# 写数据进程执行的代码:def write(q):
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())# 读数据进程执行的代码:def read(q):
    while True:
        if not q.empty():
            value = q.get(True)
            print('Get %s from queue.' % value)
            time.sleep(random.random())
        else:
            breakif __name__=='__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()    
    # 等待pw结束:
    pw.join()
    # 启动子进程pr,读取:
    pr.start()
    pr.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    print('')
    print('所有数据都写入并且读完')
로그인 후 복사
로그인 후 복사
🎜실행 결과:
import multiprocessingimport timedef add(num, value):
    print('add{0}:num={1}'.format(value, num))
    for i in range(0, 2):
        num += value        print('add{0}:num={1}'.format(value, num))
        time.sleep(1)if __name__ == '__main__':
    lock = multiprocessing.Lock()
    num = 0
    p1 = multiprocessing.Process(target=add, args=(num, 1))
    p2 = multiprocessing.Process(target=add, args=(num, 2))
    p1.start()
    p2.start()
로그인 후 복사
로그인 후 복사
🎜3. 프로세스 간 동기화 - Queue🎜
🎜프로세스는 때때로 프로세스 간 통신을 위해 많은 메커니즘을 제공해야 합니다. 의사소통.
🎜1. 큐 클래스 구문 설명🎜🎜 thead>🎜q=Queue()🎜🎜수신할 수 있는 최대 메시지 수가 괄호 안에 지정되지 않은 경우 또는 숫자 음수 값이면 허용할 수 있는 메시지 수에 상한이 없음을 의미합니다(메모리가 끝날 때까지) 🎜🎜🎜Queue.qsize()🎜🎜Returns 현재 대기열에 포함된 메시지 수 🎜🎜🎜Queue .empty()🎜🎜 대기열이 비어 있으면 True를 반환하고, 그렇지 않으면 False를 반환합니다🎜🎜🎜 대기열 .full()🎜🎜큐가 가득 차면 True를 반환하고, 그렇지 않으면 False를 반환합니다. 🎜🎜🎜Queue.get([block[, timeout]])🎜🎜🎜Get 메시지를 대기열에 넣은 다음 대기열에서 제거합니다. block의 기본값은 True🎜 입니다. 1. 블록이 기본값을 사용하고 시간 초과(초 단위)가 설정되지 않고 메시지 대기열이 비어 있는 경우 메시지 대기열에서 메시지를 읽을 때까지 프로그램이 차단됩니다(읽기 상태에서 중지됨). 이 설정되면 시간 제한 초 동안 대기하며 읽은 메시지가 없으면 "Queue.Empty" 예외가 발생합니다. 2. 블록 값이 False이고 메시지 큐가 비어 있으면 "Queue.Empty" 예외가 즉시 발생합니다🎜🎜🎜 Queue.get_nowait()🎜🎜는 Queue와 동일합니다. .get( False)🎜🎜🎜 Queue.put(item,[block[, timeout]])🎜🎜🎜큐에 항목 메시지를 씁니다. 블록의 기본값은 True입니다. 🎜. 1. 블록이 기본값을 사용하고 시간 초과(초 단위)가 설정되지 않은 경우, 메시지 큐에 쓸 공간이 없으면 메시지 큐에 공간을 사용할 수 있을 때까지 프로그램이 차단됩니다(쓰기 상태에서 중지됨). 메시지 큐. 시간 초과가 설정된 경우 시간 초과 시간 동안 대기합니다. 공간이 없으면 "Queue.Full" 예외가 발생합니다. 2. 블록 값이 False이고 메시지 큐에 쓸 공간이 없으면 즉시 "Queue.Full" 예외가 발생합니다🎜🎜🎜 Queue.put_nowait(item)🎜 🎜Quite Queue.put(항목, False)🎜🎜🎜🎜

2. Queue的使用

可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:

#coding=utf-8from multiprocessing import Queue
q=Queue(3) #初始化一个Queue对象,最多可接收三条put消息q.put("消息1") q.put("消息2")print(q.full())  #Falseq.put("消息3")print(q.full()) #True#因为消息列队已满下面的try都会抛出异常,第一个try会等待2秒后再抛出异常,第二个Try会立刻抛出异常try:
    q.put("消息4",True,2)except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())try:
    q.put_nowait("消息4")except:
    print("消息列队已满,现有消息数量:%s"%q.qsize())#推荐的方式,先判断消息列队是否已满,再写入if not q.full():
    q.put_nowait("消息4")#读取消息时,先判断消息列队是否为空,再读取if not q.empty():
    for i in range(q.qsize()):
        print(q.get_nowait())
로그인 후 복사
로그인 후 복사

运行结果:

FalseTrue消息列队已满,现有消息数量:3消息列队已满,现有消息数量:3消息1消息2消息3
로그인 후 복사
로그인 후 복사

3. Queue实例

我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:

from multiprocessing import Process, Queueimport os, time, random# 写数据进程执行的代码:def write(q):
    for value in ['A', 'B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())# 读数据进程执行的代码:def read(q):
    while True:
        if not q.empty():
            value = q.get(True)
            print('Get %s from queue.' % value)
            time.sleep(random.random())
        else:
            breakif __name__=='__main__':
    # 父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))
    # 启动子进程pw,写入:
    pw.start()    
    # 等待pw结束:
    pw.join()
    # 启动子进程pr,读取:
    pr.start()
    pr.join()
    # pr进程里是死循环,无法等待其结束,只能强行终止:
    print('')
    print('所有数据都写入并且读完')
로그인 후 복사
로그인 후 복사

运行结果:
Python 다중 프로세스 지식 포인트 요약

四、进程间同步-Lock

锁是为了确保数据一致性。比如读写锁,每个进程给一个变量增加 1,但是如果在一个进程读取但还没有写入的时候,另外的进程也同时读取了,并写入该值,则最后写入的值是错误的,这时候就需要加锁来保持数据一致性。

通过使用Lock来控制一段代码在同一时间只能被一个进程执行。Lock对象的两个方法,acquire()用来获取锁,release()用来释放锁。当一个进程调用acquire()时,如果锁的状态为unlocked,那么会立即修改为locked并返回,这时该进程即获得了锁。如果锁的状态为locked,那么调用acquire()的进程则阻塞。

1. Lock的语法说明

  • lock = multiprocessing.Lock(): 创建一个锁

  • lock.acquire() :获取锁

  • lock.release() :释放锁

  • with lock:自动获取、释放锁 类似于 with open() as f:

2. 程序不加锁时

import multiprocessingimport timedef add(num, value):
    print('add{0}:num={1}'.format(value, num))
    for i in range(0, 2):
        num += value        print('add{0}:num={1}'.format(value, num))
        time.sleep(1)if __name__ == '__main__':
    lock = multiprocessing.Lock()
    num = 0
    p1 = multiprocessing.Process(target=add, args=(num, 1))
    p2 = multiprocessing.Process(target=add, args=(num, 2))
    p1.start()
    p2.start()
로그인 후 복사
로그인 후 복사

运行结果:运得没有顺序,两个进程交替运行

add1:num=0add1:num=1add2:num=0add2:num=2add1:num=2add2:num=4
로그인 후 복사

3. 程序加锁时

import multiprocessingimport timedef add(num, value, lock):
    try:
        lock.acquire()
        print('add{0}:num={1}'.format(value, num))
        for i in range(0, 2):
            num += value            print('add{0}:num={1}'.format(value, num))
            time.sleep(1)
    except Exception as err:
        raise err    finally:
        lock.release()if __name__ == '__main__':
    lock = multiprocessing.Lock()
    num = 0
    p1 = multiprocessing.Process(target=add, args=(num, 1, lock))
    p2 = multiprocessing.Process(target=add, args=(num, 2, lock))
    p1.start()
    p2.start()
로그인 후 복사

运行结果:只有当其中一个进程执行完成后,其它的进程才会去执行,且谁先抢到锁谁先执行

add1:num=0add1:num=1add1:num=2add2:num=0add2:num=2add2:num=4
로그인 후 복사

五、进程池Pool

当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。

1. Pool类语法说明

语法格式multiprocessing.pool.Pool([processes[, initializer[, initargs[, maxtasksperchild[, context]]]]])

参数说明

  • processes:工作进程数目,如果 processes 为 None,则使用 os.cpu_count() 返回的值。

  • initializer:如果 initializer 不为 None,则每个工作进程将会在启动时调用 initializer(*initargs)。

  • maxtasksperchild:一个工作进程在它退出或被一个新的工作进程代替之前能完成的任务数量,为了释放未使用的资源。

  • context:用于指定启动的工作进程的上下文。

两种方式向进程池提交任务

  • apply(func[, args[, kwds]]):阻塞方式。

  • apply_async(func[, args[, kwds]]):非阻塞方式。使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表

multiprocessing.Pool常用函数:

메서드 이름 설명
方法名 说明
close() 关闭Pool,使其不再接受新的任务
terminate() 不管任务是否完成,立即终止
join() 主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用

2. Pool实例

初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务,请看下面的实例:

# -*- coding:utf-8 -*-from multiprocessing import Poolimport os, time, randomdef worker(msg):
    t_start = time.time()
    print("%s开始执行,进程号为%d" % (msg,os.getpid()))
    # random.random()随机生成0~1之间的浮点数
    time.sleep(random.random()*2) 
    t_stop = time.time()
    print(msg,"执行完毕,耗时%0.2f" % (t_stop-t_start))po = Pool(3)  # 定义一个进程池,最大进程数3for i in range(0,10):
    # Pool().apply_async(要调用的目标,(传递给目标的参数元祖,))
    # 每次循环将会用空闲出来的子进程去调用目标
    po.apply_async(worker,(i,))print("----start----")po.close()  
    # 关闭进程池,关闭后po不再接收新的请求po.join()  
    # 等待po中所有子进程执行完成,必须放在close语句之后print("-----end-----")
로그인 후 복사

运行结果:

----start----
0开始执行,进程号为21466
1开始执行,进程号为21468
2开始执行,进程号为21467
0 执行完毕,耗时1.01
3开始执行,进程号为21466
2 执行完毕,耗时1.24
4开始执行,进程号为21467
3 执行完毕,耗时0.56
5开始执行,进程号为21466
1 执行完毕,耗时1.68
6开始执行,进程号为21468
4 执行完毕,耗时0.67
7开始执行,进程号为21467
5 执行完毕,耗时0.83
8开始执行,进程号为21466
6 执行完毕,耗时0.75
9开始执行,进程号为21468
7 执行完毕,耗时1.03
8 执行完毕,耗时1.05
9 执行完毕,耗时1.69
-----end-----
로그인 후 복사

3. 进程池中的Queue

如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue()

而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:RuntimeError: Queue objects should only be shared between processes through inheritance.

下面的实例演示了进程池中的进程如何通信:

# -*- coding:utf-8 -*-# 修改import中的Queue为Managerfrom multiprocessing import Manager,Poolimport os,time,randomdef reader(q):
    print("reader启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
    for i in range(q.qsize()):
        print("reader从Queue获取到消息:%s" % q.get(True))def writer(q):
    print("writer启动(%s),父进程为(%s)" % (os.getpid(), os.getppid()))
    for i in "itcast":
        q.put(i)if __name__=="__main__":
    print("(%s) start" % os.getpid())
    q = Manager().Queue()  # 使用Manager中的Queue
    po = Pool()
    po.apply_async(writer, (q,))

    time.sleep(1)  # 先让上面的任务向Queue存入数据,然后再让下面的任务开始从中取数据

    po.apply_async(reader, (q,))
    po.close()
    po.join()
    print("(%s) End" % os.getpid())
로그인 후 복사

运行结果:

(11095) start
writer启动(11097),父进程为(11095)reader启动(11098),父进程为(11095)reader从Queue获取到消息:i
reader从Queue获取到消息:t
reader从Queue获取到消息:c
reader从Queue获取到消息:a
reader从Queue获取到消息:s
reader从Queue获取到消息:t(11095) End
로그인 후 복사

六、进程、线程对比

1. 功能

进程:能够完成多任务,比如 在一台电脑上能够同时运行多个QQ
线程:能够完成多任务,比如 一个QQ中的多个聊天窗口

定义的不同

  • 进程是系统进行资源分配和调度的一个独立单位.

  • 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

2. 区别

  • 一个程序至少有一个进程,一个进程至少有一个线程.
    -线程的划分尺度小于进程(资源比进程少),使得多线程程序的并发性高。
    -进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率
    Python 다중 프로세스 지식 포인트 요약
  • 线线程不能够独立执行,必须依存在进程中
  • 可以将进程理解为工厂中的一条流水线,而其中的线程就是这个流水线上的工人

3. 优缺点

  • 线程:线程执行开销小,但不利于资源的管理和保护
  • 进程:进程执行开销大,但利于资源的管理和保护

推荐学习:python视频教程

위 내용은 Python 다중 프로세스 지식 포인트 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿