一、常用方法:
1、获取当前进程id
multiprocessing.current_process().pid
os.getpid()
2、获取父进程id
os.getppid()
3、获取进程名称
multiprocessing.current_process().name
4、线程是由子线程完成这个回调函数
5、进程是由主线程完成这个回调函数
二、进程池
1、主进程不等待子进程运行结束,直接往下执行
import time
from concurrent.futures import ProcessPoolExecutor
def demo(num):
print(num)
time.sleep(5)
if __name__ == '__main__':
pool = ProcessPoolExecutor(2)
for i in range(10):
# pool.map(demo,[1,2,3]) 会执行3次,将列表内容作为参数传递
pool.submit(demo,i)
print("主进程不会等待,会马上执行这里")
2、主进程等待所有子进程运行结束再往下执行
from concurrent.futures import ProcessPoolExecutor
def demo(num):
print(num)
time.sleep(1)
if __name__ == '__main__':
pool = ProcessPoolExecutor(2)
for i in range(10):
# pool.map(demo,[1,2,3])
pool.submit(demo,i)
pool.shutdown(True)
print("主进程等待所有子进程运行结束再往下执行")
3、回调函数使用
import time
import multiprocessing
from concurrent.futures import ProcessPoolExecutor
def demo(num):
print("任务函数的进程id:",multiprocessing.current_process().pid)
print(os.getpid(),"父进程id:",os.getppid())
print(num)
time.sleep(1)
return num
#回调函数
def call_back(res):
#线程是由子线程完成这个回调函数
#进程是由主进程完成这个回调函数
print("回调函数的进程id:",multiprocessing.current_process().pid)
print("获取demo函数的返回值:",res.result())
if __name__ == '__main__':
pool = ProcessPoolExecutor(2)
for i in range(10):
print("主进程id:",multiprocessing.current_process().pid)
print("主进程id:",os.getpid())
# pool.map(demo,[1,2,3])
fur = pool.submit(demo,i)
#call_back的参数是demo函数的返回值,会自动传递
fur.add_done_callback(call_back)
pool.shutdown(True)
print("主进程等待所有子进程运行结束再往下执行")
三、进程池中锁的使用
import multiprocessing
def demo(num,lock):
with lock:
num += 1
if __name__ == '__main__':
p = ProcessPoolExecutor(3)
#lock = multiprocessing.RLock() #进程池不能使用进程的锁
manage = multiprocessing.Manager()#进程池有专门的锁和队列
lock_obj = manage.RLock()
for i in range(5):
p.submit(demo,1,lock_obj)