一、python并发编程之多进程

1.1 multiprocessing模块介绍

  由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。

  multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。

  该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。

 

构造方法:

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

  group: 线程组,目前还没有实现,库引用中提示必须是None; 
  target: 要执行的方法; 
  name: 进程名; 
  args/kwargs: 要传入方法的参数。

实例方法:

  is_alive():返回进程是否在运行。

  join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。

  start():进程准备就绪,等待CPU调度

  run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。

  terminate():不管任务是否完成,立即停止工作进程

属性:

  daemon:和线程的setDeamon功能一样

  name:进程名字。

  pid:进程号。

 

方法介绍:

p1=Process(target=foo,args=('p1',))    开启子进程
p.start():启动进程,并调用该子进程中的p.run() 
p.run():进程启动时运行的方法,正是它去调用target指定的函数,我们自定义类的类中一定要实现该方法  

p.terminate():强制终止进程p,不会进行任何清理操作,如果p创建了子进程,该子进程就成了僵尸进程,使用该方法需要特别小心这种情况。如果p还保存了一个锁那么也将不会被释放,进而导致死锁
p.is_alive():如果p仍然运行,返回True

p.join([timeout]):主线程等待p终止(强调:是主线程处于等的状态,而p是处于运行的状态)。timeout是可选的超时时间,需要强调的是,p.join只能join住start开启的进程,而不能join住run开启的进程

 

linux中,主进程的全局变量,子进程能用

window中,主进程的全局变量,子进程不能用能用

 

1.2 创建并开启子进程的两种方式

通过函数:

#函数方式
def foo(name):
    print('%s starting'%name)
    time.sleep(random.randrange(1,5))
    print('%s is end'%name)

if __name__ == '__main__':
    print('主进程starting')

    p1=Process(target=foo,args=('p1',))
    p2=Process(target=foo,args=('p2',))
    p3=Process(target=foo,args=('p3',))

    # p1.daemon = True
    # p2.daemon = True
    # p3.daemon = True

    p1.start()
    p2.start()
    p3.start()

    # p1.join()
    # p2.join()
    # p3.join()

    # time.sleep(1)
    print('主进程ending')

通过类的方式:

#用类的方式创建子进程
class MyProcess(Process):
    def __init__(self,name):
        super().__init__()
        # self.name=name

    def run(self):
        print('%s starting' % self.name)
        time.sleep(random.randrange(1, 5))
        print('%s id is %s' % (self.name,self.pid))
        print('%s is end'%self.name)

if __name__ == '__main__':
    print('主进程starting')
    for i in range(4):
        p = MyProcess(str(i))
        p.start()

    print('主进程ending')

1.3 Process对象的其他方法或属性

#进程对象的其他方法一:terminate,is_alive
from multiprocessing import Process
import time
import random

class Piao(Process):
    def __init__(self,name):
        self.name=name
        super().__init__()

    def run(self):
        print('%s is piaoing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s is piao end' %self.name)


p1=Piao('egon1')
p1.start()

p1.terminate()#关闭进程,不会立即关闭,所以is_alive立刻查看的结果可能还是存活
print(p1.is_alive()) #结果为True

print('开始')
print(p1.is_alive()) #结果为False
进程对象的其他方法一:terminate,is_alive

相关文章:

  • 2022-01-15
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-09
  • 2021-11-28
  • 2021-12-04
  • 2021-12-04
相关资源
相似解决方案