python并发编程之进程的开启及相关参数

1、如何开启进程

开始进程有两种方法:
1.p.start()
2.p.run()调用run方法,不会启动子进程,第二种开启进程的方式,需要用到run方法, 重写run方法
# win中要想开启进程,必须放在main里面

from multiprocessing import Process
import time

def write():
    time.sleep(1)
    with open('abc', 'a') as f:
        f.write('ly is dsb')
        f.write('\n')

if __name__ == '__main__':
    # 1.开启进程先实例化,得到进程对象
    # target => 你要执行的任务,  函数
    p = Process(target=write)  # 通知操作系统取开启进程
    # 2.必须调用start方法
    p.start()

2、Process的参数

#开启一个进程
from multiprocessing import Process
def write():
  pass
if __name__ == '__main__':
        # 1.开启进程先实例化,得到进程对象
        #进程对象括号有四个参数:
          target=None  #你要执行的任务,  函数
          name=None    #进程名
          args=()      #传入的参数在元组中
          kwargs={},   #传入的参数得是字典形式
        arges和kwarges只需要有一个就行
        p = Process(target=write)  # 通知操作系统取开启进程
        # 2.必须调用start方法
        p.start()

3、Process类的方法

p.start() # 必须调用start方法, 开启进程必须使用的,开始进程需要时间,在这个时间里先去运行主程序
p.run()   # 子进程,再主进程(调用run方法,不会启动子进程,第二种开启进程的方式,需要用到run方法, 重写run方法)
p.join()   # 等待子进程执行完毕,在执行主进程
print(p.is_alive()) #判断进程是否存在,存在打印True,不存在打印Flase
p.terminate() #杀死进程 用法:p.terminate() time.sleep(1) p.is_alive()

4、Process类的属性

p.daemon:默认值为False,如果设为True,代表p为后台运行的守护进程,当p的父进程终止时,p也随之终止,
  并且设定为True后,p不能创建自己的新进程,必须在p.start()之前设置
p.name:进程的名称
p.pid:进程的pid
p.exitcode:进程在运行时为None、如果为–N,表示被信号N结束(了解即可)
p.authkey:进程的身份验证键,默认是由os.urandom()随机生成的32字符的字符串。
  这个键的用途是为涉及网络连接的底层进程间通信提供安全性,这类连接只有在具有相同的身份验证键时才能成功(了解即可)

5、获取进程id号

from multiprocessing import Process
import os
def write(name):
    print('write子进程的id:%s'%os.getpid())
    print('write父进程的id:%s' % os.getppid())#就是main中主程序的id
if __name__ == '__main__':
    p = Process(target=write,args=('ly',))
    p.start()
    print(p.pid)#就是子进程id
    print("main_主进程的id号:%s" % os.getpid())  #是主程序的id
    print("main_父进程的id号:%s" % os.getppid()) #是pycharm的进程id

6、开启多进程 无序

import time
from multiprocessing import Process
def f(i):
    print("第%s个进程" % i)
    time.sleep(1)
if __name__ == '__main__':
    p_lst = []
    for i in range(5):
        p = Process(target=f, args=(i,))
        p.start()
        p_lst.append(p)

7、开始多进程 有序

import time
from multiprocessing import Process
def f(i):
    print("第%s个进程" % i)
    time.sleep(1)
if __name__ == '__main__':
    p_lst = []
    for i in range(5):
        p = Process(target=f, args=(i,))
        p.start()
	p_lst.append(p)

	for j in p_lst:
		j.join()

8、进程锁
上锁与解锁之间的运行完,才开始下一个

  import os
  import time
  from multiprocessing import Process, Lock
  def task(i, lock):
      # 第一步开始上锁
      lock.acquire()

      print("第%s个,进程id:%s开始执行了" % (i, os.getpid()))
      time.sleep(2)
      print("第%s个,进程id:%s执行结束了" % (i, os.getpid()))

      # 释放锁
      lock.release()
  if __name__ == '__main__':
      # 实例化得到一把锁,  5个进程用的是同一把锁
      lock = Lock()
      for i in range(5):
          p = Process(target=task, args=(i, lock))
          p.start()
posted @ 2021-07-20 17:25  zhutianyu  阅读(307)  评论(0)    收藏  举报