import os
from multiprocessing import Process
import time
def func(args,args2):
print(args,args2)
time.sleep(1)
print('子进程:',os.getpid())
print('子进程的父进程:',os.getppid()) #查看当前进程的父进程号

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

 

#进程的生命周期
# 主进程
# 子进程
# 开启了子进程的主进程:自己代码长,等待自己的代码执行结束
# 子进程的执行时间长,主进程会在主进程代码执行完毕之后等待子进程执行完毕之后,主进程才结束
from multiprocessing import Process
import time
def func(arg1,arg2):
    time.sleep(1)
    print('*'*arg2)
if __name__ == '__main__':
    p_lst = []
    for i in range(10):
        p = Process(target=func,args=(10*i,20*i))
        p.start()
        p_lst.append(p)
    [p.join() for p in p_lst]
    print('运行完了')

多进程创建多个文件

from multiprocessing import Process
import time,os
def func(filename,content):
    with open(filename,'w') as f:
        f.write(content*10*'*')
if __name__ == '__main__':
    p_lst = []
    for i in range(5):
        p = Process(target=func,args=('info%s'%i,i))
        p_lst.append(p)
        p.start()
    [p.join() for p in p_lst]
    print('运行完了')
    print([i for i in os.walk(r'D:\Python\PY\9python\py9-day36--多进程及进程锁')])

 

开启多进程的第二种方式
自定义类 继承Process类
必须实现一个run方法,run方法中是在子进程中执行的代码
import os
from multiprocessing import Process
class MyProcess(Process):
    def run(self):
        print(os.getpid())
if __name__ == '__main__':
    print('主:',os.getpid())
    p1 = MyProcess()
    p1.start()
    p2 = MyProcess()
    p2.start()

 多进程socket实现

#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()
    while True:
        conn,addr = sk.accept()
        p =Process(target=serve,args=(conn,))
        p.start()
    sk.close()

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

 守护进程

from multiprocessing import Process
import time
def func():
    while True:
        time.sleep(0.1)
        print('我还活着')

if __name__ == '__main__':
    p = Process(target=func)
    p.daemon = True  #设置子进程为守护进程
    p.start()
    i = 0
    while i<5:
        print('我是一个socket server')
        time.sleep(1)
        i+=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()

 

posted on 2019-02-16 14:28  Tim-code  阅读(135)  评论(0编辑  收藏  举报