1.进程
#多线程实现不了真正的多线程
#多进程 第一种方法
from multiprocessing import Process
def f(name):
time.sleep(1)
print('yanga11ang',name)
if __name__ == '__main__'
ps=[]
for i in range(3):
p=Process(target=f,args=('iadf',))
ps.append(p)
p.start()
for p in ps:
p.join()
#多进程 第二种方法
from multiprocessing import Process
class MyProcess(Process):
def run(self):
time.sleep(1)
print('yanga11ang',self.name) #默认是他的一个进程编号
if __name__ == '__main__'
ps=[]
for i in range(3):
p=MyProcess()
ps.append(p)
p.start()
for p in ps:
p.join()
#进程关系
from multiprocessing import Process
import os,time
def info(title):
print(title)
print('module name',__name__)
print('parent process:',os.getppid()) #打印父进程编号
print('process id:',os.getpid()) #进程编号
if __name__ == '__main__'
info('\033[32;1mmain process line\033[0m')
time.sleep(3)
p=Process(target=info,args=('bob',))
p.start()
p.join()
#一些方法
#name 进程名字
#is_alive() 返回进程是否在运行
#join(timeout) :阻塞当前上下文,知道调用此方法的进程终止或到达指定的timeout(可选参数)
#start() 进程准备就绪,等待cpu调用
#run() start调用run方法 如果实例进程没有传入定制的target
#terminate() 不管任务是否完成立即停止工作进程
2.进程的通信
#使用进程队列queue
from multiprocessing import process,Queue
def f(q):
q.put([1,2,'yanga1ang'])
print('subprocess id:',id(q)) #多个queue地址不同
if __name__=='__main__':
q=Queue()
print(id(q))
ps=[]
for i in range(3):
p=Process(target=f,args=(q,))
ps.append(p)
p.start()
print(q.get())
print(q.get())
print(q.get())
#queue 之间有莫名的一种联系,queue在某个进程里面改变,其他进程里面也会改变
#queue 是multiprocess里面自己写的队列而不是普通的
#使用进程管道 Pipe
from multiprocessing import process,Pipe
def f(conn):
conn.send([43,None,'yang11ang'])
conn.close()
if __name__=='__main__':
q=Queue()
parent_conn,child_conn=Pipe()
p=Process(target=f,args=(child_conn,))
p.start()
print(parent_conn.recv())
p.join()
3 .数据共享 进程的manager
#可以共用市局
from multiprocessing import Process Manager
def f(d,l,n):
d[n]='1'
d['2']=2
l.append(n)
print(1)
if __name__=='__main__':
with Manager() as manager: # manage=Manager()
d=manager.dict() #创建的可以共享的字典
l=manager.list(rang[5])
ps=[]
for i in range(10):
p=Process(target=f,args=(d,l,i))
ps.append(p)
p.start()
for i in range(10):
p.join()