Python笔记day36(并发)|多进程、join()、守护进程、加锁

版权声明:转载请注明来源 https://blog.csdn.net/qq_34755081/article/details/82079710

1,多进程

import os
import time
from multiprocessing import Process
def func(args,args2):
    print(args,args2)
    time.sleep(3)
    print('子进程 :', os.getpid())
    print('子进程的父进程 :', os.getppid())
    print(12345)

if __name__ == '__main__':
    p = Process(target=func,args=('参数','参数2'))   # 注册
    # p是一个进程对象,还没有启动进程
    p.start()       # 开启了一个子进程
    print('*'*10)
    print('父进程 :',os.getpid()) # 查看当前进程的进程号
    print('父进程的父进程 :',os.getppid()) # 查看当前进程的父进程

# 进程的生命周期
    # 主进程
    # 子进程
    # 开启了子进程的主进程 :
        # 主进程自己的代码如果长,等待自己的代码执行结束,
        # 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后 主进程才结束

2,join()方法

# join()
import time
from multiprocessing import Process

def func(arg1,arg2):
    print('*'*arg1)
    time.sleep(5)
    print('*'*arg2)

if __name__ == '__main__':
    p = Process(target=func,args=(10,20))
    p.start()
    print('hahahaha')
    p.join()     # 是感知一个子进程的结束,将异步的程序改为同步
    print('====== : 运行完了')

3,开启多个子线程

import os
import time
from multiprocessing import Process

def func(filename,content):
    with open(filename,'w') as f:
        f.write(content*10*'*')

if __name__ == '__main__':
    p_lst = []
    for i in range(10):
        p = Process(target=func,args=('info%s'%i,0))
        p_lst.append(p)
        p.start()
    for p in p_lst:p.join()   # 之前的所有进程必须在这里都执行完才能执行下面的代码
    print([i for i in os.walk(r'E:\python10\day37')])

# 同步 0.1 * 500  = 50
# 异步 500 0.1    = 0.1
# 多进程写文件
# 首先往文件夹中写文件
# 向用户展示写入文件之后文件夹中所有的文件名

4,使用对象开启多线程

import os
from multiprocessing import Process

class MyProcess(Process):
    def __init__(self,arg1,arg2):
        super().__init__()
        self.arg1 = arg1
        self.arg2 = arg2

    def run(self):
        print(self.pid)
        print(self.name)
        print(self.arg1)
        print(self.arg2)

if __name__ == '__main__':
    p1 = MyProcess(1,2)
    p1.start()
    p2 = MyProcess(3,4)
    p2.start()

# 自定义类 继承Process类
# 必须实现一个run方法,run方法中是在子进程中执行的代码

5,进程直接数据隔离

# 进程 与 进程之间数据是隔离的
import os
from multiprocessing import Process

def func():
    global n   # 声明了一个全局变量
    n = 0       # 重新定义了一个n
    print('pid : %s'%os.getpid(),n)

if __name__ == '__main__':
    n = 100
    p = Process(target=func)
    p.start()
    p.join()
    print(os.getpid(),n)

6,守护进程


# 守护进程 会 随着 主进程的代码执行完毕 而 结束
# 在主进程内结束一个子进程 p.terminate()
    #  结束一个进程不是在执行方法之后立即生效,需要一个操作系统响应的过程
# 检验一个进程是否活着的状态 p.is_alive()
# p.name p.pid 这个进程的名字和进程号
# 子进程 -- > 守护进程
import time
from multiprocessing import Process

def func():
    while True:
        time.sleep(0.2)
        print('我还活着')

def func2():
    print('in func2 start')
    time.sleep(8)
    print('in func2 finished')

if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True   # 设置子进程为守护进程
    p.start()
    p2 = Process(target=func2)
    p2.start()
    p2.terminate()     # 结束一个子进程
    time.sleep(1)
    print(p2.is_alive())  # 检验一个进程是否还活着
    print(p2.name)
    # i = 0
    # while i<5:
    #     print('我是socket server')
    #     time.sleep(1)
    #     i+=1

7,加锁

文件 ticket 内容 {“ticket”: 1}

# 锁

# 火车票
import json
import time
from multiprocessing import Process
from multiprocessing import Lock

# def show(i):
#     with open('ticket') as f:
#         dic = json.load(f)
#     print('余票: %s'%dic['ticket'])

def buy_ticket(i,lock):
    lock.acquire() #拿钥匙进门
    with open('ticket') as f:
        dic = json.load(f)
        time.sleep(0.1)
    if dic['ticket'] > 0 :
        dic['ticket'] -= 1
        print('\033[32m%s买到票了\033[0m'%i)
    else:
        print('\033[31m%s没买到票\033[0m'%i)
    time.sleep(0.1)
    with open('ticket','w') as f:
        json.dump(dic,f)
    lock.release()      # 还钥匙

if __name__ == '__main__':
    # for i in range(10):
    #     p = Process(target=show,args=(i,))
    #     p.start()
    lock = Lock()
    for i in range(10):
        p = Process(target=buy_ticket, args=(i,lock))
        p.start()

8,使用多线程实现socket服务端并发

client端

import socket

sk = socket.socket()
sk.connect(('127.0.0.1',8080))
msg = sk.recv(1024).decode('utf-8')
print(msg)
msg2 = input('>>>').encode('utf-8')
sk.send(msg2)
sk.close()

server端

import socket
from multiprocessing import Process
def serve(conn):
    ret = '你好'.encode('utf-8')
    conn.send(ret)
    msg = conn.recv(1024).decode('utf-8')
    print(msg)
    conn.close()

if __name__ == '__main__' :
    sk = socket.socket()
    sk.bind(('127.0.0.1',8080))
    sk.listen()
    try:
        while True:
            conn,addr = sk.accept()
            p = Process(target=serve,args=(conn,))
            p.start()
    finally:
        sk.close()

猜你喜欢

转载自blog.csdn.net/qq_34755081/article/details/82079710