python并发编程1-进程

主进程和子进程

python并发编程1-进程_第1张图片

运行结果:
python并发编程1-进程_第2张图片

一旦进程创建后,进程就由操作系统调度

代码解析:

python并发编程1-进程_第3张图片

子进程与父进程

python并发编程1-进程_第4张图片

python并发编程1-进程_第5张图片

所以主进程的父进程就是pycharm

args传参

一个参数

python并发编程1-进程_第6张图片

两个参数

python并发编程1-进程_第7张图片

python并发编程1-进程_第8张图片

join作用(创建多个线程):

python并发编程1-进程_第9张图片

python并发编程1-进程_第10张图片

python并发编程1-进程_第11张图片

 

python并发编程1-进程_第12张图片

不一定哪个进程先执行,10个进程的执行顺序不固定

代码延伸:
 

from multiprocessing import Process
import time
import os
def func(filename,content):
   with open(filename,'w') as f:
       f.write(content*10*'*')
if __name__ =='__main__':
    p_list=[]
    for i in range(10):
        p = Process(target=func, args=('info%s'%i,i))
        p_list.append(p)
        p.start()
        # p.join() 如果加有这句,就会变为同步
    [p.join() for p in p_list]  # 之前的所有进程必须在这里执行完毕才能执行下面的代码
    # p0.join()
    # p1.join()
    # p2.join()#即使p2线程已经结束,可以执行此代码,若p0.p1还没有结束,则需要等到他们结束才能执行此代码
    # p3.join()



    print([i for i in os.walk(r'E:\pythoncode\网络编程\day6-并发编程')])

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

开启多个进程(写文件):

from multiprocessing import Process
import time
import os
def func(filename,content):
   with open(filename,'w') as f:
       f.write(content*10*'*')
if __name__ =='__main__':
    p_list=[]
    for i in range(10):
        p = Process(target=func, args=('info%s'%i,i))
        p_list.append(p)
        p.start()
        # p.join() 如果加有这句,就会变为同步
    [p.join() for p in p_list]  # 之前的所有进程必须在这里执行完毕才能执行下面的代码
    print([i for i in os.walk(r'E:\pythoncode\网络编程\day6-并发编程')])

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

运行结果:

python并发编程1-进程_第13张图片

开启多个线程的第二种方式:

from multiprocessing import Process
import os
# 第一种方式
# p=Process(target=,args)
# p.start()
#第二种
# 自定义类 继承Process类
# 必须实现一个run方法,run方法是在子进程中执行的代码

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)
        print(os.getpid())
    def start(self):
        self.run()
if __name__ =='__main__':
    print('主进程pid:',os.getpid())
    p1=MyProcess(1,2)
    p1.start()
    p2=MyProcess(3,4)
    p2.start()

运行结果:

python并发编程1-进程_第14张图片

多进程之间的数据隔离

# 进程与进程之间
from multiprocessing import Process
import os
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)

运行结果:

python并发编程1-进程_第15张图片对这个数据隔离不太懂

守护进程

#守护进程
#子进程--》守护进程

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

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

if __name__=='__main__':
    p=Process(target=func)
    p.daemon=True
    p.start()
    p2 = Process(target=func2)
    p2.start()
    p2.terminate()  #结束一个子进程
    print(p2.is_alive())
    time.sleep(2)
    print(p2.is_alive())
    i=0
    while i<4:
        print('socketserver')
        time.sleep(1)
        i+=1

# 守护进程会随着 主进程的代码 执行完毕 而 结束

运行结果:
python并发编程1-进程_第16张图片

锁机制

from multiprocessing import Process,Lock
import json
import time
def show(i):
    with open('ticket') as f:
        dic=json.load(f)
        print('第%s个人还有%s张票'%(i,dic['ticket']))

def buy_ticket(lock,i):
    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)
    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=(lock,i))
        p.start()

运行结果:
python并发编程1-进程_第17张图片

错误案例:

from multiprocessing import Process
def func():
    num=input('>>>')
    print(num)

if __name__ =='__main__':
    Process(target=func).start()

# 发生错误是因为现在这个控制台是主进程的控制台,而输入操作是子线程开启的,所以在主控制台不可以输入,所以报错

多进程实现qq聊天(socketserver模块):

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)
    # ret=input('>>>').encode('utf-8')
    # conn.send(ret)
    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)
ret=input('>>>').encode('utf-8')
sk.send(ret)
print(msg)
sk.close()

运行结果:

python并发编程1-进程_第18张图片python并发编程1-进程_第19张图片

python并发编程1-进程_第20张图片

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(python)