multiprocessing模块-多进程知识点

多进程代码

' from multiprocessing import Process'
Process(target=func).start()

方法

# 进程对象.start()     开启一个子进程
# 进程对象.join()      感知一个子进程的结束
# 进程对象.terminate() 结束一个子进程
# 进程对象.is_alive()  查看某个子进程是否还在运行

属性

# 进程对象.name        进程名
# 进程对象.pid         进程号
# 进程对象.daemon      值为True的时候,表示新的子进程是一个守护进程
        # 守护进程 随着主进程代码的执行结束而结束
        # 一定在start之前设置

多进程锁

'from multiprocessing import Lock'
# l = Lock()
# l.acquire()   # 拿钥匙
# 会造成数据不安全的操作
# l.release()   # 还钥匙

多进程的信号量

这个跟锁的用法差不多,差别就是能够设置钥匙的数量,即进程的数量,普通的锁就是只有一把钥匙

import time
import random
from multiprocessing import Process
from multiprocessing import Semaphore

def ktv(i,sem):
    sem.acquire()    #获取钥匙
    print('%s走进ktv'%i)
    time.sleep(random.randint(1,5))
    print('%s走出ktv'%i)
    sem.release()   


if __name__ == '__main__' :
    sem = Semaphore(4)
    for i in range(20):
        p = Process(target=ktv,args=(i,sem))
        p.start()

多进程的事件

# from multiprocessing import Event
# 一个信号可以使所有的进程都进入阻塞状态
# 也可以控制所有的进程解除阻塞
# 一个事件被创建之后,默认是阻塞状态
# e = Event()  # 创建了一个事件
# print(e.is_set())   # 查看一个事件的状态,默认被设置成阻塞
# e.set()      # 将这个事件的状态改为True
# print(e.is_set())
# e.wait()     # 是依据e.is_set()的值来决定是否阻塞的
# print(123456)
# e.clear()    # 将这个事件的状态改为False
# print(e.is_set())
# e.wait()     # 等待 事件的信号被变成True
# print('*'*10)


# set 和 clear
    #  分别用来修改一个事件的状态 True或者False
# is_set 用来查看一个事件的状态
# wait 是依据事件的状态来决定自己是否在wait处阻塞
    #  False阻塞 True不阻塞


# 红绿灯事件
import time
import random
from multiprocessing import Event,Process
def cars(e,i):
    if not e.is_set():
        print('car%i在等待'%i)
        e.wait()    # 阻塞 直到得到一个 事件状态变成 True 的信号
    print('\033[0;32;40mcar%i通过\033[0m' % i)

def light(e):
    while True:
        if e.is_set():
            e.clear()
            print('\033[31m红灯亮了\033[0m')
        else:
            e.set()
            print('\033[32m绿灯亮了\033[0m')
        time.sleep(2)

if __name__ == '__main__':
    e = Event()
    traffic = Process(target=light,args=(e,))
    traffic.start()
    for i in range(20):
        car = Process(target=cars, args=(e,i))
        car.start()
        time.sleep(random.random())

多进程的队列

# 队列 先进先出
# IPC
# from multiprocessing import Queue
# q = Queue(3)  #设置队列的长度
# q.put(1)      #放入数据
# q.put(2)
# q.put(3)
# print(q.full())   # 队列是否满了
# print(q.get())   #取出数据
# print(q.get())
# print(q.get())
# print(q.empty())   # 判断队列是否为空
# while True:
#     try:
#         q.get_nowait()
#     except:
#         print('队列已空')
#         time.sleep(0.5)
# for i in range(6):
#     q.put(i)

from multiprocessing import Queue,Process
def produce(q):
    q.put('hello')

def consume(q):
    print(q.get())

if __name__ == '__main__':
    q = Queue()
    p = Process(target=produce,args=(q,))
    p.start()
    c = Process(target=consume, args=(q,))
    c.start()

你可能感兴趣的:(multiprocessing模块-多进程知识点)