网络编程进阶

进程:

 

import os
from multiprocessing import Process

def func():
    print('子进程%s, 父进程%s' %(os.getpid(),os.getppid()))

if __name__ == '__main__':
    p = Process(target=func) # 子进程3616, 父进程5916
    p.start()
开辟子进程 基础用法
# 带参数用法
import os
from multiprocessing import Process

def func(i):
    print('主进程%s,子进程[%s]%s' %(os.getppid(),i,os.getpid()))

if __name__ == '__main__':
    for i in range(5):
        p = Process(target = func, args=(i,))
        p.start()
    print('执行结束...')
带参数的用法
# 同步 join的用法
import os
from multiprocessing import Process

def func(i):
    print('主进程%s,子进程[%s]%s' %(os.getppid(),i,os.getpid()))

if __name__ == '__main__':
    l = []
    for i in range(5):
        p = Process(target = func, args=(i,))
        p.start()
        l.append(p)
    for i in l:
        i.join()
    print('执行结束...')
join的用法
# 自定义类创建进程
## 必须继承Process这个父类
## 所有进程执行任务的逻辑写在run方法里面,必须定义run方法
## 如果要带参数,要重写父类的init方法
from multiprocessing import Process
import os

class MyProcess(Process):
    def __init__(self,args):
        super().__init__()
        self.args = args
    def run(self):
        print('主进程%s,子进程%s,参数是%s' %(os.getppid(),os.getpid(),self.args))
if __name__ == '__main__':
    l = []
    for i in range(5):
        p = MyProcess(i)
        p.start()
        l.append(p)
    for i in l:
        i.join()
    print('执行结束...')
自定义类创建进程
# 守护进程
## 进程.daemon = True 设置当前进程为守护进程,主程序执行结束后带走守护进程,不管守护进程是否执行结束
## 设置守护进程要在 进程.start()之前设置。
import os
from multiprocessing import Process

def func1(args):
    print('func1',args)
def func2(args):
    print('func2',args)

if __name__ == '__main__':
    for i in range(5):
        p1 = Process(target=func1,args=(i,))
        p2 = Process(target=func2,args=(i,))
        p1.daemon = True
        p1.start()
        p2.start()
    print('执行结束...')

--------------------------------
不开守护的执行结果:
执行结束...
func2 1
func1 1
func1 2
func2 3
func1 0
func1 4
func2 0
func1 3
func2 2
func2 4
----------------------------------------
打开守护的执行结果:
执行结束...
func2 0
func2 4
func2 1
func2 2
func2 3
---------------------
守护进程
# 守护进程之监控报活
## 确保服务器运行正常,服务器上会开辟一个进程,用于向监控服务器每个几个小时就发一次信息。如果监控服务器很长时间没有收到来自服务器的消息,那就需要维修了
import time
from multiprocessing import Process

def alive():
    """这个进程是报活进程"""
    while True:
        print('给监控服务器发消息,当前5号服务器工作正常...')
        time.sleep(5) # 现实中设置为4小时或者其他,秒在这里是为了方便
def func():
    """这个进程是服务器的工作内容,这个就一直运行"""
    while True:
        time.sleep(24*60*60) # 现实场景就是服务器在统计财务报表,24小时不停工作
        print('我是5号服务器,我负责统计财务报表...') # 服务器在统计报表,但是会开一个新的进程用于监控报活

if __name__ == '__main__':
    p1 = Process(target=alive)
    p2 = Process(target=func)
    p1.daemon = True # 报活进程作为守护进程,服务器挂了,就不会像监控服务去发消息了
    p1.start()
    p2.start()
    p2.join() # 服务器本身功能设置成为主进程的同步进程
守护进程之监控报活
import json
from multiprocessing import Process,Lock

def ticket_info(sign, dic=None):
    """读写配置文件的函数,用于更改票数"""
    if sign == 'r':
        dic = json.load(open('ticket'))
        return dic
    elif sign == 'w':
        json.dump(dic, open('ticket','w'))

def get_ticket(person,lock):
    """查票"""
    dic = ticket_info('r')
    count = dic['count']
    print('%s查询到现存票数%s' %(person, count))
    if count > 0:
        lock.acquire()
        print(person, '抢到了...')
        dic['count'] -= 1
        ticket_info('w', dic)
        lock.release()
    else:
        print(person, '没票了...')

if __name__ == '__main__':
    lock = Lock()
    l = []
    for person in range(50):
        p = Process(target=get_ticket,args=(person,lock))
        p.start()
    #     l.append(p)
    # for i in l:
    #     i.join()
    # print('结束了...')

----------------------------------
ticket 文件存储的字典 {“count”:1}
-----------------------------------

# 数据共享
# Lock

import configparser
from multiprocessing import Process,Lock

def ticket_info(sign,count=None):
    """读写配置文件的函数,用于更改票数"""
    if sign == 'r':
        cf = configparser.ConfigParser()
        cf.read('ticket')
        count = cf.getint('ticket', 'count')
        return count
    elif sign == 'w':
        cf = configparser.ConfigParser()
        cf['ticket'] = {'count': count}
        cf.write(open('ticket', 'w'))


def get_ticket(person,lock):
    """查票"""
    count = ticket_info('r')
    print('%s查询到现存票数%s' %(person, count))
    if count > 0:
        lock.acquire()
        print(person, '抢到了...')
        count -= 1
        ticket_info('w', count)
        lock.release()
    else:
        print(person, '没票了...')


if __name__ == '__main__':
    lock = Lock()
    l = []
    for person in range(50):
        p = Process(target = get_ticket,args=(person,lock))
        p.start()
        l.append(p)
    for i in l:
        i.join()
    print('结束了...')

----------------------------------
ticket 文件存储的
[ticket]
count = 1
-----------------------------------
数据共享之Lock 抢票软件
# Semaphore 信号量 可以控制锁的数量
'''
from multiprocessing import Process, Semaphore
import time
# sem = Semaphore(4) # 获取对象,4把锁
# sem.acquire()
# sem.release()

def ktv(person,sem):
    sem.acquire()
    print('%s在唱歌' %person)
    time.sleep(2)
    sem.release()

if __name__ == '__main__':
    sem = Semaphore(4)
    for i in range(20):
        p = Process(target=ktv,args=(i,sem))
        p.start()
Semahore 多把锁 抢歌房

 

# Event 事件
# 基本语法
from multiprocessing import Process,Event

e = Event()
print(e.is_set()) # 默认False
e.wait(2) # 阻塞2秒
print('程序进行中...') # 阻塞2秒后代码执行

---------------------------------------------------

# 模拟红绿灯
def traffic_light(e):
    print('红灯亮')
    while True:
        if e.is_set():
            # 绿灯状态,亮1秒钟
            time.sleep(1)
            print('红灯亮')
            # 把True ==> False
            e.clear()
        else:
            # 红灯状态,亮一秒钟
            time.sleep(1)
            print('绿灯亮')
            # 把False ==> True
            e.set()

def car(e,i):
    if e.is_set():
        # 绿灯状态,车放行
        print('car %s is running' % i)
    else:
        # 红灯状态,阻塞
        print('car %s is waiting' %i)

if __name__ == '__main__':

    e = Event()
    p1 = Process(target=traffic_light, args=(e,))
    p1.start()
    for i in range(10):
        p2 = Process(target=car,args=(e,i))
        p2.start()
        time.sleep(random.uniform(0,1))
Event 事件 模拟红绿灯
from multiprocessing import Queue, Process

# 基本用法
q = Queue()
q.put(111)
q.put(222)
res = q.get()
print(res)  # 111
res = q.get()
print(res)  # 222
res = q.get() # 阻塞 
---------------------------------------

# 进程之间通过队列交换数据
def func(q):
    # 子进程取数据
    res = q.get()
    print(res)
if __name__ == '__main__':
    q = Queue()
    p = Process(target=func,args=(q,))
    p.start()
    q.put(11)

------------------------------------------
# 生产者消费者模型 通过ut一个None 来结束
from multiprocessing import Process, Queue
import time

def consumer(q,name):
    while True:
        food = q.get()
        if food == None:
            break
        print('%s吃了%s' %(name,food))

def producer(q,name,food):
    for i in range(5):
        print('%s生产了%s个%s' %(name,i,food))
        q.put(food+str(i))
    q.put(None)

if __name__ == '__main__':
    q = Queue()
    p1 = Process(target=consumer, args=(q,'ali'))
    p1.start()
    p2 = Process(target=producer, args=(q,'sue','包子'))
    p2.start()

------------------------------------------------

# 生产者消费者模型 改良版
from multiprocessing import Process, JoinableQueue
import time

def consumer(q,name):
    while True:
        food = q.get()
        print('%s吃了%s' %(name,food))
        q.task_done()

def producer(q,name,food):
    for i in range(5):
        print('%s生产了%s个%s' %(name,i,food))
        q.put(food+str(i))

if __name__ == '__main__':
    q = JoinableQueue()
    p1 = Process(target=consumer, args=(q,'ali'))
    p1.daemon = True
    p1.start()
    p2 = Process(target=producer, args=(q,'sue','包子'))
    p2.start()
    p2.join()
    q.join()
数据共享之队列 Queue 生产者消费者模型
# Manager 共享列表,字典数据
from multiprocessing import Manager, Process, Lock

def work(data,lock):
    lock.acquire()
    data['count'] -= 1
    lock.release()

if __name__ == '__main__':
    m = Manager()
    data = m.dict({'count':1000})
    l = []
    lock = Lock()
    for i in range(100):
        p = Process(target=work,args=(data,lock))
        p.start()
        l.append(p)
    for i in l:
        i.join()
    print(data)
数据共享之Manager

 

 

 

posted @ 2020-09-18 23:34  正在学Python  阅读(119)  评论(0编辑  收藏  举报