关于进程
2018-05-29 本文已影响0人
梦亦殇灬
image
Hello 进程
代码在没有运行的时候叫程序 ,而运行着的代码叫进程
一、fork函数 (注意,fork函数只能在Unix/Linux/Mac上运行windows不可以)
#coding = utf-8
import os
f = os.fork()
if f == 0:
print("哈哈")#这是子进程
else:
print("嘿嘿")#这是父进程
程序执行到fork时会自动创建子进程,复制父进程的所有信息到子进程
父进程和子进程一定会从fork函数得到一个返回值 其中子进程的返回值一定是0 父进程的返回值是子进程的id号
getpid() and getppid()
#coding = utf-8
import os
f = os.fork()
if f == 0:
print("我是子进程%d,我的父进程是%d"%(os.getpid(),os.getppid()))
else:
print("我是父进程%d,我的子进程是%d"%(os.getpid(),f))
Hello multiprocessing
(解决在Windows用python编写多进程)
#coding = utf-8
from multiprocessing import Process #注意p大写
import os
import time
def run_proc(name,age,**kwargs):
print("子进程运行中---pid = %d name =%s age = %d"%(os.getpid(),name,age))
print(kwargs)
if __name__=="__main__":
p = Process(target = run_proc,args=("test",18,),kwargs={"laowang":"帮忙"})
print("父进程开始")
p.start()
print("父进程等子进程结束")
p.join()
print("父子进程结束")
Hello Pool(进程池)
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
#coding =utf-8
from multiprocessing import Pool
def test(i):
print("%d子进程开始执行"%i)
if __name__ == '__main__':
po = Pool(3)
for i in range(10):
po.apply_async(test,(i,))
#po.apply(test,(i,))
po.close()
po.join()
po.apply_async(test,(i,)) 此为非阻塞方式 Pool()创建了几个进程就一起执行几个
po.apply(test,(i,)) 此为阻塞方式 不管Pool创建了几个,执行完一个在执行下一个
Hello Queue(队列)
进程间互通消息
#coding=utf-8
from multiprocessing import Queue
q=Queue(4) #初始化一个Queue对象,最多可接收三条put消息
q.put("消息1")
q.put("消息2")
q.put("消息3")
if not q.full():
q.put_nowait("消息4")
else:
print("消息列队已满,现有消息数量:%s"%q.qsize())
#读取消息时,先判断消息列队是否为空,再读取
if not q.empty():
for i in range(q.qsize()):
print(q.get_nowait())
#Queue()初始化若括号中没有指定数量,代表可接受的消息没有上限,直到内存的尽头
#方法 Queue.qsize():返回当前队列数量
# Queue.empty():若队列为空 返回True 否则返回 False
# Queue.full():若队列满了返回True 否则返回False
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue()
其余的和上面代码一样
from multiprocessing import Manager,Pool
#代码
#pass
q=Manager().Queue() #使用Manager中的Queue来初始化
各位小哥哥,小姐姐懂了吗?