day39 Pyhton 并发编程02 后

本文深入探讨了Python中多进程的应用,包括子进程的创建、锁的使用以防竞态条件、多进程并发服务器的搭建,以及客户端与服务器的交互示例。

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

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))

 

 

转载于:https://www.cnblogs.com/pythonz/p/10084217.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值