day39 Pyhton 并发编程02 后

一.开启子进程的另一种方式

import os
from multiprocessing import Process
class MyProcess(Process):
    def __init__(self,参数):
        super().__init__()
        self.一个属性 = 参数

    def run(self):
        print('子进程中要执行的代码')

if __name__ == '__main__':
    conn = '一个链接'
    mp = MyProcess(conn)
    mp.start()

锁的概念

import json
import time
from multiprocessing import Process,Lock

def search(name):
    '''查询余票的功能'''
    with open('ticket') as f:
        dic = json.load(f)
        print(name , dic['count'])

def buy(name):
    with open('ticket') as f:
        dic = json.load(f)
    time.sleep(0.1)
    if dic['count'] > 0:
        print(name,'买到票了')
        dic['count'] -=1
    time.sleep(0.1)
    with open('ticket','w') as f:
        json.dump(dic,f)

def get_ticket(name,lock):
    search(name)
    lock.acquire()  # 只有第一个到达的进程才能获取锁,剩下的其他人都需要在这里阻塞
    buy(name)
    lock.release()  # 有一个人还锁,会有一个人再结束阻塞拿到钥匙

if __name__ == '__main__':
    dic={'count':1}
    with open('ticket', 'w') as f:
        json.dump(dic, f)
    lock = Lock()
    for i in range(10):
        p = Process(target=get_ticket,args=('name%s'%i,lock))
        p.start()

多进程并发
server
import socket,time
from multiprocessing import Process
def talk(conn):

    while True:
        msg = conn.recv(1024).decode()
        conn.send(msg.upper().encode())

if __name__ == '__main__':
    # 这句话下面的所有代码都只在主进程中执行
    sk = socket.socket()
    sk.bind(('127.0.0.1',9000))
    sk.listen()
    while True:
        conn,addr = sk.accept()
        Process(target=talk,args=(conn,)).start()

# 卡 大量的while True 并且代码中并没有太多的其他操作
# 如果我们使用socketserver,不会这么卡
# 多进程确实可以帮助我们实现并发效果,但是还不够完美
# 操作系统没开启一个进程要消耗大量的资源
# 操作系统要负责调度进程 进程越多 调度起来就越吃力
client
import socket

sk = socket.socket()
sk.connect(('127.0.0.1',9000))


while True:
    sk.send(b'hello')
    print(sk.recv(1024))

 

 
posted @ 2018-12-07 17:48  Python张梦书  阅读(191)  评论(0编辑  收藏  举报