python起多进程服务_python 多进程

本文详细介绍了Python中的多进程操作,包括进程的创建、同步、通过Queue和Pipe进行进程间通信,以及使用进程池Pool。示例代码展示了如何在不同场景下使用multiprocessing模块,帮助理解进程管理在实际编程中的应用。
摘要由CSDN通过智能技术生成

1.进程的创建

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

frommultiprocessing import Process

import time,os

def Hi(name):

time.sleep(3)

print("Hello %s" %name,time.ctime())

print("进程号是",os.getpid())if __name__=="__main__":for i in range(3):

t= Process(target=Hi,args=("萌萌",))

t.start()

print("主进程号:",os.getpid())

print("end all")

View Code

2.进程的阻碍

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

frommultiprocessing import Process

import time,os

def hello(name):

time.sleep(2)

print("Hello %s" %name,time.ctime())

print("进程号是",os.getpid())if __name__=="__main__":

L=[]for i in range(3):

t= Process(target=hello,args=("梦梦",))

t.start()

L.append(t)

# t.join()

# t.join() # 阻碍主进程for t inL:

t.join()

print("主进程号:",os.getpid())

print("end all")

View Code

2.2.进程的继承调用

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

from multiprocessing importProcessimporttime,osclassMyProcess(Process):#def __init__(self,name):

#super(MyProcess,self).__init__()

#self.name =name

defrun(self):

time.sleep(1)print("hello",self.name,time.ctime())if __name__ == '__main__':

p_list=[]for i in range(3):#p =MyProcess("张三")

p =MyProcess()

p.start()

p_list.append(p)#p.join()

for p inp_list:

p.join()print("end")

View Code

3.进程的守护

#___''Daemon:进程守护、子进程跟随主进程一起退'''

classmyprocess:defmusic1(self):print("begin to listen %s" %time.ctime())

time.sleep(2)print("stop to listen %s" %time.ctime())defgame1(self):print("begin to game %s" %time.ctime())

time.sleep(3)print("stop to game %s" %time.ctime())if __name__ == "__main__":

duixiang=myprocess()

p1= Process(target=duixiang.music1)

p2= Process(target=duixiang.game1)

p2.daemon=True

L=[]

L.append(p1)

L.append(p2)for i inL:

i.start()#i.join()

print("all over end.......")

4.进程通信队列-Queue

from multiprocessing importProcess,Queueimporttimedeffoo(q):

time.sleep(1)

q.put(6776)

q.put({"name":"张三"})if __name__ == '__main__':

q=Queue()#q=multiprocessing.Queue()

#创建一个进程队列

p=Process(target=foo,args=(q,))

p.start()print(q.get())print(q.get_nowait())print(q.get(block=False))

5.进程通信-管道Pipe

from multiprocessing importProcess, Pipeimporttimeimportosdeff(conn):

conn.send([12,{"name":"子豪"},"hello"])

date=conn.recv()print("父亲发的消息是",date,time.ctime())

conn.close()print("子进程进程号%s,子进程拿到的数据ID %s:"%(os.getpid(),id(conn)))if __name__ == '__main__':

parent_conn,child_conn=Pipe()

p=Process(target=f,args=(child_conn,))

p.start()

sunsend=parent_conn.recv()print("儿子发消息是:",sunsend,time.ctime())

parent_conn.send("儿子,你好")

parent_conn.close()print("父进程进程号%s,父进程拿到的数据ID %s:" %(os.getpid(),id(parent_conn)))

p.join()

6.进程同步

'''加锁的部分完全是串行的'''

from multiprocessing importProcess,Lockimporttimedeff(l,i):

l.acquire()

time.sleep(1)print("hello",i)

l.release()if __name__ == '__main__':

lock=Lock()for num in range(10):

Process(target=f,args=(lock,num)).start()

7.进程间的数据共享 Managers

# ------------------Managers 进程间数据共享-----------------

# # Queue、Pipe 只实现了数据的互交并没有实现数据的共享

from multiprocessing import Manager,Process

import os

def fun(d,L,n):

d[n]="1" # {"0": "1"}

d["2"]="2" # {"0": "1","2":"2"}

L.append(n)

print('子进程进程号:%s, 字典id %s,列表id %s'%(os.getpid(),id(d),id(L)))

if __name__ == '__main__':

with Manager() as manager:

d = manager.dict()

L = manager.list(range(9))

for i in range(10):

p = Process(target=fun,args=(d,L,i))

p.start()

p.join()

print(d)

print(L)

print("所有任务都已经结束")

# print(d)

# print(L)

8.进程池

fe6b0c1b9b70e17f89f5ffc32ba4cfe0.png

deff(i):

time.sleep(1)print(i)if __name__ == '__main__':

pool=Pool(5) #不填参数默认以CPU数量运行

for i in range(100):#pool.apply(func=f,args=(i,)) # 同步接口

pool.apply_async(func=f,args=(i,))

pool.close()

pool.join()#进程池的格式先close后join、调用顺序是固定的

print("over all")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值