py

楼主: sustainer123 (caster)   2024-09-25 14:23:04
进程(process)
进程是加载内存且将执行的程式
打开工作管理员
里面的东西就是进程
每个进程会被分配一个独立id(pid)
简单来讲 电脑执行一项任务就是一个进程
多进程(mutiprocessing)
假设我们需要同时完成多个任务
这时候可以使用多进程
多进程也就是说主进程外再建立子进程
并且把主进程的东西整份copy过去子进程
unix中 python可以使用fork()建立子进程
fork()会把主进程的东西复制到子进程
并回传pid到主进程与子进程
主进程会拿到子进程的pid
子进程会拿到0
假设子进程需要主进程的pid
可以使用get.ppid()
windows并没有fork指令
我看文档 windows只能用spawn
spawn与fork差别我没看很懂
大致上就fork比较快但比较不安全
spawn比较慢但比较安全
反正windows也用不到spawn以外两种 先这样:)))
有兴趣可以看下面网站
总之 我们使用multiprocessing
我直接copy py文档的code:
from multiprocessing import Process
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
print('process id:', os.getpid())
def f(name):
info('function f')
print('hello', name)
if __name__ == '__main__':
info('main line')
p = Process(target=f, args=('bob',))
p.start()
p.join()
输出:
main line
module name: __main__
parent process: 1280
process id: 24780
function f
module name: __mp_main__
parent process: 24780
process id: 3672
hello bob
首先 程式执行主进程
之后程式执行子进程
这边使用process这个类完成任务
target是目标函数 args是传入目标函数的参数
p.start()是启动子进程
p.join()是等待子进程结束才会往下运行
假设一次要设置多个进程
我们可以使用pool 一样使用文档code:
from multiprocessing import Pool
def f(x):
return x*x
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(f, [1, 2, 3,4,5,6]))
这边我有修改一下 我在list里面多加几个元素
这程式是pool池开五个进程
然后子进程去处理下面的程式
我们这边只开五个进程 但里面有6个元素
所以6必须等到有个进程被释出 此元素才会被处理
一般来说 pool开的大小 == cpu核数
等等再写进程间沟通跟锁 先这样
参考资料:
https://stackoverflow.com/questions/64095876/multiprocessing-fork-vs-spawn
https://docs.python.org/zh-cn/3.12/library/multiprocessing.html

Links booklink

Contact Us: admin [ a t ] ucptt.com