python之路——38

Posted wan2-0

tags:

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

复习

1.多进程
1.方法
进程对象.start() 开启一个进程
进程对象.join() 感知一个进程的结束
进程对象.terminate() 结束一个进程
进程对象.is_alive() 查看某个进程是否存在
2.属性
进程对象.name 进程名
进程对象.pid 进程号
进程对象.daemon 值为True,新的子进程为守护进程
随着主进程代码执行的结束而结束
start之前设置

学习内容

见代码区

代码区

1.子进程中不能有input操作

from multiprocessing import Process

def func():
    num = input(>>> )
    print(num)


if __name__ == __main__:
    Process(target=func).start()

2.进程同步控制——信号量 (多个锁)

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


def ktv(i,sem):
    sem.acquire()
    print(%s走进ktv%i)
    time.sleep(random.randint(5,10))
    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()

3.事件——一个信号控制多个进程同时执行或阻塞   红绿灯

from multiprocessing import Process
from  multiprocessing import Event
import time,random

def cars(i,e):
    if not e.is_set():
        print(车辆%s在等待 %i)
        e.wait()
    print(车辆%s通过 %i)



def traffic_light(e):
    while 1:
        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=traffic_light,args=(e,))
    traffic.start()
    for i in range(20):
        car = Process(target=cars, args=(i,e))
        car.start()
        time.sleep(random.randint(1,3))

4.队列

from multiprocessing import Process,Queue
def produce(q):
    q.put(from func-produce)
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()

5.消费者,生产者模型——joinablequeue

from multiprocessing import Process,JoinableQueue
import time,random
def producer(name,food,q):
    for i in range(5):
        time.sleep(random.randint(1,2))
        f = %s生产了%s%s%(name,food,i)
        print(f)
        q.put(f)
    q.join()

def consumer(name,q):
    while 1:
        c = q.get()
        if c == None:
            print(%s 得到一个None%name)
            break
        print(\033[31m%s消费了%s\033[0m%(name,c))
        time.sleep(random.randint(1,2))
        q.task_done()
if __name__ == __main__:
    q = JoinableQueue()
    p1 = Process(target=producer,args=(alex,包子,q))
    p2 = Process(target=producer,args=(egon,馒头,q))
    p1.start()
    p2.start()
    c1 = Process(target=consumer,args=(小明,q))
    c2 = Process(target=consumer,args=(小华,q))
    c1.daemon = True
    c2.daemon = True
    c1.start()
    c2.start()
    p1.join()
    p2.join()

 

 

以上是关于python之路——38的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud升级之路2020.0.x版-38. 实现自定义 WebClient

代码精进之路系列聊聊那些年遇到过的奇葩代码

SpringCloud升级之路2020.0.x版-38. 实现自定义 WebClient 的 NamedContextFactory

python之路之前没搞明白4面向对象(封装)

是否可以动态编译和执行 C# 代码片段?

编写代码片段的更简洁的方法