关于进程

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来初始化

各位小哥哥,小姐姐懂了吗?

上一篇下一篇

猜你喜欢

热点阅读