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()

浙公网安备 33010602011771号