python进程

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python进程相关的知识,希望对你有一定的参考价值。

一、进程

    python中提供多进程包:multiprocessing,支持子进程,通信,共享内存,执行不同形式的同步,提供了Process、Pipi、Lock等组件

多进程和多线程


  多进程和多线程区别:

  多线程使用的是CPU的一个核,适合IO密集型

  多进程使用的是CPU的多个核,适合运算密集型


1)multiprocessing的方法

  cpu_count():统计cpu总数

  active_children():获取所有子进程


例子:

#!/usr/bin/env python
import multiprocessing

p = multiprocessing.cpu_count()
m = multiprocessing.active_children()

print(p)
print(m)

运行结果:

8

[]


2)Process进程

 创建一个Process对象:p = multiprocessing.Precess(target=worker,args=(2,))


 说明:

 target = 函数名字

 args = 函数需要的的参数,以tuple形式传入


3)Process常用方法

  is_alive():判断进程是否存活

  run():启动进程

  start():启动进程,会自动调用run方法,常用

  join(timeout=):等待进程结束或者知道超时


4)Process常用属性

  name:进程名字

  pid:进程的pid


例子:

#!/usr/bin/env python
import time
import multiprocessing

def worker(interval):
    time.sleep(interval)
    print("hello,China")
    
if __name__ == "__main__":
    p = multiprocessing.Process(target=worker,args=(5,))
    
    p.start()
    
    print(p.is_alive())
    p.join(timeout=3)
    
    print(p.name)
    print(p.pid)
    print("This is end")

运行结果:

True

Process-1

121764

This is end

hello,China


实例: 多进程

import time
import multiprocessing

def worker(name,interval):
    print("{0} start" .format(name))
    time.sleep(interval)
    print("{0} end" .format(name))
    
if __name__ == "__main__":
    print("main start")
    print("The computer has {0} core" .format(multiprocessing.cpu_count()))
    
    p1 = multiprocessing.Process(target=worker,args=("worker",2))
    p2 = multiprocessing.Process(target=worker,args=("worker",3))
    p3 = multiprocessing.Process(target=worker,args=("worker",4))
    
    p1.start()
    p2.start()
    p3.start()
    
    for p in  multiprocessing.active_children():
        print("The pid of {0} is {1}" .format(p.name,p.pid) )
    print("main end")

运行结果:

main start

The computer has 4 core

The pid of Process-1 is 21112

The pid of Process-3 is 20536

The pid of Process-2 is 2116

main end

worker start

worker start

worker start

worker end

worker end

worker end



二、lock组件

  当我们用多进程来读写文件时,如果一个写一个读同时进行时不行的,必须一个写完之后,另一个才可以读。因此需要用到一个锁机制进行控制


实例1:多进程不加锁

import multiprocessing
import time

def add(number,value,lock):
    print("init,member = {1}".format(value,number))
    for i in xrange(1,6):
        number += value
        time.sleep(1)
        print("add {0},number = {1}".format(value,number))
        
if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = 0
    
    p1 = multiprocessing.Process(target=add,args=(number,1,lock))
    p3 = multiprocessing.Process(target=add,args=(number,3,lock))
    
    p1.start()
    p3.start()
    
    print("main end")

运行结果:

main end

init,member = 0

init,member = 0

add 1,number = 1

add 3,number = 3

add 1,number = 2

add 3,number = 6

add 1,number = 3

add 3,number = 9

add 1,number = 4

add 3,number = 12

add 1,number = 5

add 3,number = 15


实例2:多进程加锁

import multiprocessing
import time

def add(number,value,lock):
    lock.acquire()
    try:
        print("init,member = {1}".format(value,number))
        for i in xrange(1,6):
            number += value
            time.sleep(1)
            print("add {0},number = {1}".format(value,number))
    except Exception as e:
        raise e
    finally:
        lock.release()
        
if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = 0
    
    p1 = multiprocessing.Process(target=add,args=(number,1,lock))
    p3 = multiprocessing.Process(target=add,args=(number,3,lock))
    
    p1.start()
    p3.start()
    
    print("main end")

运行结果:

main end

init,member = 0

add 1,number = 1

add 1,number = 2

add 1,number = 3

add 1,number = 4

add 1,number = 5

init,member = 0

add 3,number = 3

add 3,number = 6

add 3,number = 9

add 3,number = 12

add 3,number = 15



三、共享内存

  两个“同时“读写的文件,其中一个作用的结果对另外一个有影响。multiprocessing提供了Value和Array模块


实例1:多进程内存共享不加锁

import multiprocessing
import time

def add(number,value1):
    try:
        print("init,member = {1}".format(value1,number.value))
        for i in xrange(1,6):
            number.value += value1
            time.sleep(1)
            print("add {0},number = {1}".format(value1,number.value))
    except Exception as e:
        raise e
        
if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = multiprocessing.Value("i",0)
    
    p1 = multiprocessing.Process(target=add,args=(number,1))
    p3 = multiprocessing.Process(target=add,args=(number,3))
    
    p1.start()
    p3.start()
    
    print("main end")

运行结果:

main end

init,member = 0

init,member = 1

add 1,number = 4

add 3,number = 5

add 1,number = 8

add 3,number = 9

add 1,number = 12

add 3,number = 13

add 1,number = 16

add 3,number = 17

add 1,number = 20

add 3,number = 20


实例2: 多进程共享内存加锁

import multiprocessing
import time

def add(number,value1,lock):
    lock.acquire()
    try:
        print("init,member = {1}".format(value1,number.value))
        for i in xrange(1,6):
            number.value += value1
            time.sleep(1)
            print("add {0},number = {1}".format(value1,number.value))
    except Exception as e:
        raise e
    finally:
        lock.release()
        
if __name__ == "__main__":
    lock = multiprocessing.Lock()
    number = multiprocessing.Value("i",0)
    
    p1 = multiprocessing.Process(target=add,args=(number,1,lock))
    p3 = multiprocessing.Process(target=add,args=(number,3,lock))
    
    p1.start()
    p3.start()
    
    print("main end")

运行结果:

main end

init,member = 0

add 1,number = 1

add 1,number = 2

add 1,number = 3

add 1,number = 4

add 1,number = 5

init,member = 5

add 3,number = 8

add 3,number = 11

add 3,number = 14

add 3,number = 17

add 3,number = 20




以上是关于python进程的主要内容,如果未能解决你的问题,请参考以下文章

[Python3] 043 多线程 简介

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

代码片段:Shell脚本实现重复执行和多进程

python中的多线程和多进程编程

使用 asyncio 将 bash 作为 Python 的子进程运行,但 bash 提示被延迟

LINUX PID 1和SYSTEMD PID 0 是内核的一部分,主要用于内进换页,内核初始化的最后一步就是启动 init 进程。这个进程是系统的第一个进程,PID 为 1,又叫超级进程(代码片段