进程的创建

2018-04-27  本文已影响0人  furuiyang

进程的创建-multiprocessing

multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情。

两个while循环一起执行的代码实现

from multiprocessing import  Process
import time

def run_proc():
    '''子进程要执行的代码'''
    while True:
        print("---2---")
        time.sleep(1)

if __name__ == '__main__':
    p = Process(target=run_proc)
    p.start()
    while True:
        print("---1---")
        time.sleep(1)

代码说明

创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动

进程pid

import multiprocessing
import os
import time

def run_proc():
    # os.getpid() 取得当前进程的id
    # os.getppid() :取得当前进程的父进程的id
    while True:
        time.sleep(1)
        print()
        print("--run_proc--子进程的父进程的id=%d   子进程的id= %d" % (os.getppid(), os.getpid()))

if __name__ == '__main__':
    print("--main--主进程的父进程id=%d   主进程的id= %d" % (os.getppid(), os.getpid()))
    p1 = multiprocessing.Process(target=run_proc)
    p1.start()
进程id.png

Process语法结构如下

Process([group [, target [, name [, args [, kwargs]]]]])

target:如果传递了函数的引用,可以认为这个子进程就执行这里的代码
args:给target指定的函数传递的参数,以元组的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,可以不设定
group:指定进程组,大多数情况下用不到

Process创建的实例对象的常用方法:

start():启动子进程实例(创建子进程)
is_alive():判断进程子进程是否还在活着
join([timeout]):是否等待子进程执行结束,或等待多少秒

join方法的作用是阻塞,等待子线程结束,join方法有一个参数是timeout,即如果主线程等待timeout,子线程还没有结束,则主线程强制结束子线程。

terminate():不管任务是否完成,立即终止子进程

Process创建的实例对象的常用属性:

name:当前进程的别名,默认为Process-N,N为从1开始递增的整数
pid:当前进程的pid(进程号)

给子进程指定的函数传递参数

# coding:utf-8
from multiprocessing import Process
import os
from time import sleep

def run_proc(name,age,**kwargs):
    for i in range(10):
        print('子进程运行中,name= %s,age=%d ,pid=%d...' % (name, age, os.getpid()))
        print(kwargs)
        sleep(0.2)

if __name__ == '__main__':
    p = Process(target=run_proc,args=('test',18),kwargs={"m":20})
    p.start()
    sleep(1) # 1s之后 立即结束子进程
    p.terminate()
    p.join()

运行结果

进程传参运行结果.png

进程之间不同享全局变量

# coding:utf-8
from multiprocessing import Process
import os
import time

nums = [11,22]

def work1():
    print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))
    for i in range(3):
        nums.append(i)
        time.sleep(1)
        print('in process1 pid=%d,nums=%s' %(os.getpid(),nums))

def work2():
    print('in process2 pid=%d,nums=%s'%(os.getpid(),nums))
    
if __name__ == '__main__':
    p1 = Process(target=work1)
    p1.start()
    p1.join()

    p2 = Process(target=work2)
    p2.start()

运行结果:

/home/python/.virtualenvs/django_py3/bin/python /home/python/Desktop/demo/process_demo/demo004.py
in process1 pid=15096,nums=[11, 22]
in process1 pid=15096,nums=[11, 22, 0]
in process1 pid=15096,nums=[11, 22, 0, 1]
in process1 pid=15096,nums=[11, 22, 0, 1, 2]
in process2 pid=15102,nums=[11, 22]

Process finished with exit code 0
上一篇下一篇

猜你喜欢

热点阅读