Python 多进程

学习廖雪峰的Python教程中的多进程部分,知识点整理


一、 Unix、Linux

unix/linux系统下,可以直接使用fork()创建子进程。fork()函数调用一次,返回两次,因为操作系统自动把当前进程(父进程)复制了一份(子进程),然后分别在父进程和子进程内返回,创建成功子进程内返回pid=0,父进程内返回值为子进程的pid

使用fork()需要import os

示例代码:

1
2
3
4
5
6
7
8
9
import os

print('Process (%s) start...' % os.getpid())
# Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
print('I am child process (%s) and my parent is %s.' % (os.getpid(), os.getppid()))
else:
print('I (%s) just created a child process (%s).' % (os.getpid(), pid))

执行结果:

1
2
3
Process (63034) start...
I (63034) just created a child process (63035).
I am child process (63035) and my parent is 63034.

二、跨平台使用

由于python是跨平台的,自然也提供一个跨平台的多进程支持,multiprocessing模块就是跨平台版本的多进程模块。

  • Process

使用Process()创建子进程实例,之后使用实例的start()方法开始启动子进程

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from multiprocessing import Process
import os

#子进程要执行的代码
def run_proc(name):
print('Run child process %s (%s).' % (name,os.getpid()))

if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
#创建子进程
p = Process(target=run_proc, args=('test',))
print('Child process will start')
#开始启动子进程
p.start()
#join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步
p.join()
print('Child process end.')

执行结果:

1
2
3
4
Parent process 62629.
Child process will start
Run child process test (62630).
Child process end.
  • Pool

如果要启用大量子进程,可以使用进程池Pool

示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from multiprocessing import Pool
import os,time,random

def long_time_task(name):
print('Run task %s (%s)...' % (name,os.getpid()))
start = time.time()
#random()随机产生0~1之间的数
time.sleep(random.random()*3)
end = time.time()
print('Task %s runs %.2f seconds.' % (name,(end-start)))

if __name__ == '__main__':
print('Parent process %s.' % os.getpid())
#限制同时运行4个子进程
p = Pool(4)
for i in range(5):
p.apply_async(long_time_task,args=(i,))
print('Waiting for all subprocesses done')
#调用join()之前必须先调用close(),之后不能继续添加新的Process了
p.close()
#等待所有子进程执行完毕
p.join()
print('All subprocesses done.')

执行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
Parent process 63187.
Waiting for all subprocesses done
Run task 1 (63189)...
Run task 2 (63190)...
Run task 3 (63191)...
Run task 0 (63188)...
Task 3 runs 0.15 seconds.
Run task 4 (63191)...
Task 2 runs 0.96 seconds.
Task 1 runs 1.18 seconds.
Task 0 runs 1.72 seconds.
Task 4 runs 2.17 seconds.
All subprocesses done.

可以通过执行结果看到,定义Pool(4)之后只能同时执行4个进程。

使用bettercap进行渗透测试 Sublime中按ctrl+B调用python3运行
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×