Python-多进程与进程池

# fork方法是调用一次,返回两次,原因在于操作系统将当前进程(父进程)复制出一份进程(子进程),这两个进程几乎完全相同,
# 于是fork方法分别在父进程和子进程中返回。子进程中永远返回0,父进程中返回的是子进程的ID。
import os
 
if __name__ == '__main__':
    print('current Process (%s) start ...' % (os.getpid()))
    pid = os.fork()
    print(pid)
    if pid < 0:
        print('error in fork')
    elif pid == 0:
        print('I am child process(%s) and my parent process is (%s)' % (os.getpid(), os.getppid()))
    else:
        print('I(%s) created a chlid process (%s).' % (os.getpid(), pid))
 

# multiprocessing模块提供了一个Process类来描述一个进程对象。
# 创建子进程时,只需要传入一个执行函数和函数的参数,即可完成一个Process实例的创建,
# 用start()方法启动进程,用join()方法实现进程间的同步。
import os
from multiprocessing import Process
 
 
def run_proc(name):
    print('Child process %s (%s) Running...' % (name, os.getpid()))
 
 
if __name__ == '__main__':
    print('Parent process %s.' % os.getpid())
    for i in range(5):
        p = Process(target=run_proc, args=(str(i),))
        print('Process will start.')
        p.start()
        p.join()
    print('Process end.')
 

# Pool可以提供指定数量的进程供用户调用,默认大小是CPU的核数。当有新的请求提交到Pool中时,如果池还没有满,
# 那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,
# 那么该请求就会等待,直到池中有进程结束,才会创建新的进程来处理它。
from multiprocessing import Pool
import os, time, random
 
 
def run_task(name):
    print('Task %s (pid = %s) is running...' % (name, os.getpid()))
    time.sleep(random.random() * 3)
    print('Task %s end.' % name)
 
 
if __name__ == '__main__':
    print('Current process %s.' % os.getpid())
    p = Pool(processes=3)
    for i in range(5):
        p.apply_async(run_task, args=(i,))
    print('Waiting for all subprocesses done...')
    p.close()
    p.join()                                #join方法会等待所有子进程执行完毕
    print('All subprocesses done.')
 

猜你喜欢

转载自www.cnblogs.com/juchangfei/p/12802753.html