并发编程(4)多进程开发
进程是计算机中资源分配的最小单元;一个进程中可以有多个线程,同一个进程中的线程共享资源;
进程与进程之间则是相互隔离。
Python中通过多进程可以利用CPU的多核优势,计算密集型操作适用于多进程。
1.1 进程介绍
import multiprocessing
def task():
pass
if __name__ == '__main__':
p1 = multiprocessing.Process(target=task)
p1.start()
from multiprocessing import Process
def task(arg):
pass
def run():
p = multiprocessing.Process(target=task, args=('xxx',))
p.start()
if __name__ == '__main__':
run()
1.2 常见功能
进程的常见方法:
-
p.start(),当前进程准备就绪,等待被CPU调度(工作单元其实是进程中的线程)。 -
p.join(),等待当前进程的任务执行完毕后再向下继续执行。import time from multiprocessing import Process def task(arg): time.sleep(2) print("执行中...") if __name__ == '__main__': multiprocessing.set_start_method("spawn") p = Process(target=task, args=('xxx',)) p.start() p.join() print("继续执行...") -
p.daemon = 布尔值,守护进程(必须放在start之前)p.daemon =True,设置为守护进程,主进程执行完毕后,子进程也自动关闭。p.daemon =False,设置为非守护进程,主进程等待子进程,子进程执行完毕后,主进程才结束。
import time from multiprocessing import Process def task(arg): time.sleep(2) print("执行中...") if __name__ == '__main__': multiprocessing.set_start_method("spawn") p = Process(target=task, args=('xxx',)) p.daemon = True p.start() print("继续执行...") -
进程的名称的设置和获取
import os import time import threading import multiprocessing def func(): time.sleep(3) def task(arg): for i in range(10): t = threading.Thread(target=func) t.start() print(os.getpid(), os.getppid()) print("线程个数", len(threading.enumerate())) time.sleep(2) print("当前进程的名称:", multiprocessing.current_process().name) if __name__ == '__main__': print(os.getpid()) multiprocessing.set_start_method("spawn") p = multiprocessing.Process(target=task, args=('xxx',)) p.name = "哈哈哈哈" p.start() print("继续执行...") -
自定义进程类,直接将线程需要做的事写到run方法中。
import multiprocessing class MyProcess(multiprocessing.Process): def run(self): print('执行此进程', self._args) if __name__ == '__main__': multiprocessing.set_start_method("spawn") p = MyProcess(args=('xxx',)) p.start() print("继续执行...") -
CPU个数,程序一般创建多少个进程?(利用CPU多核优势)。
import multiprocessing multiprocessing.cpu_count()import multiprocessing if __name__ == '__main__': count = multiprocessing.cpu_count() for i in range(count - 1): p = multiprocessing.Process(target=xxxx) p.start()
2.进程间数据的共享
进程是资源分配的最小单元,每个进程中都维护自己独立的数据,不共享。
import multiprocessing
def task(data):
data.append(666)
if __name__ == '__main__':
data_list = []
p = multiprocessing.Process(target=task, args=(data_list,))
p.start()
p.join()
print("主进程:", data_list) # []
如果想要让他们之间进行共享,则可以借助一些特殊的东西来实现。
浙公网安备 33010602011771号