python创建子进程的几种方式

    Python的os模块封装了常⻅的系统调⽤,其中就包括fork,可以在Python程序中轻松创建⼦进程:

    程序执⾏到os.fork()时,操作系统会创建⼀个新的进程(⼦进程),然后复制⽗进程的所有信息到⼦进程中然后⽗进程和⼦进程都会从fork()函数中得到⼀个返回值,在⼦进程中这个值⼀定是0,⽽⽗进程中是⼦进程的 id号

    但是由于Windows没有fork调⽤,难道在Windows上⽆法⽤Python编写多进程的程序?

    Python是跨平台的,⾃然提供了⼀个跨平台的多进程⽀持。multiprocessing模块就是跨平台版本的多进程模块。

第一种:multiprocessing

 #coding=utf-8
 from multiprocessing import Process
 import os
    # ⼦进程要执⾏的代码
    def run_proc(name):
        print('⼦进程运⾏中,name= %s ,pid=%d...' % (name, os.getpid()))
    if __name__=='__main__':
        print('⽗进程 %d.' % os.getpid())
        p = Process(target=run_proc, args=('test',))
        print('⼦进程将要执⾏')
        p.start()
        p.join()
        print('⼦进程已结束')

   

其中join()⽅法可以等待⼦进程结束后再继续往下运⾏,通常⽤于进程间的同步。


第二种:Process⼦类

  from multiprocessing import Process
  import time
  import os
    #继承Process类
    class Process_Class(Process):
        #因为Process类本身也有__init__⽅法,这个⼦类相当于重写了这个⽅法,
        #但这样就会带来⼀个问题,我们并没有完全的初始化⼀个Process类,所以就不能使⽤从这个类继承的⼀些⽅法和属性,
        #最好的⽅法就是将继承类本身传递给Process.__init__⽅法,完成这些初始化操作
        def __init__(self,interval):
            Process.__init__(self)
            self.interval = interval
        #重写了Process类的run()⽅法
        def run(self):
            print("⼦进程(%s) 开始执⾏,⽗进程为(%s)"%(os.getpid(),os.getppid()))
            t_start = time.time()
            time.sleep(self.interval)
            t_stop = time.time()
            print("(%s)执⾏结束,耗时%0.2f秒"%(os.getpid(),t_stop-t_start))
    if __name__=="__main__":
        t_start = time.time()
        print("当前程序进程(%s)"%os.getpid())
        p1 = Process_Class(2)
        #对⼀个不包含target属性的Process类执⾏start()⽅法,就会运⾏这个类中的run()⽅法,所以这⾥会执⾏p1.run()
        p1.start()
        p1.join()
        t_stop = time.time()
        print("(%s)执⾏结束,耗时%0.2f"%(os.getpid(),t_stop-t_start))

第三种:进程池Pool

from multiprocessing import Pool
import os,time,random

def worker(msg):
    t_start = time.time()
    print("%s开始执⾏,进程号为%d"%(msg,os.getpid()))
    #random.random()随机⽣成0~1之间的浮点数
    time.sleep(random.random()*2)
    t_stop = time.time()
    print(msg,"执⾏完毕,耗时%0.2f"%(t_stop-t_start))
po=Pool(3) #定义⼀个进程池,最⼤进程数3
for i in range(0,10):
    #Pool.apply_async(要调⽤的⽬标,(传递给⽬标的参数元祖,))
    #每次循环将会⽤空闲出来的⼦进程去调⽤⽬标
    po.apply_async(worker,(i,))
print("----start----")
po.close() #关闭进程池,关闭后po不再接收新的请求
po.join() #等待po中所有⼦进程执⾏完成,必须放在close语句之后
print("-----end-----")
multiprocessing.Pool常⽤函数解析:

    apply_async(func[, args[, kwds]]) :使⽤⾮阻塞⽅式调⽤func(并⾏执⾏,堵塞⽅式必须等待上⼀个进程退出才能执⾏下⼀个进程),args为传递给func的参数列表,kwds为传递给func的关键字参数列表;apply(func[, args[, kwds]]):使⽤阻塞⽅式调⽤funcclose():关闭Pool,使其不再接受新的任务;terminate():不管任务是否完成,⽴即终⽌;join():主进程阻塞,等待⼦进程的退出, 必须在close或terminate之后使⽤;



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 中有多种方法可以实现多进程,包括使用 `os.fork()`、`multiprocessing` 模块和 `concurrent.futures` 模块等。 1. 使用 `os.fork()` `os.fork()` 是一个 Unix 系统调用,它可以复制当前进程,创建一个新进程。父进程和子进程会共享代码段,但是各自有独立的数据段和堆栈段。在 Python 中,可以通过 `os.fork()` 实现多进程,示例代码如下: ```python import os pid = os.fork() if pid == 0: # 子进程 print('I am child process, my pid is', os.getpid()) else: # 父进程 print('I am parent process, my pid is', os.getpid(), 'and my child pid is', pid) ``` 2. 使用 `multiprocessing` 模块 `multiprocessing` 模块是 Python 内置的多进程模块,可以很方便地实现多进程。示例代码如下: ```python import multiprocessing def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建子进程 p = multiprocessing.Process(target=worker) # 启动子进程 p.start() # 等待子进程结束 p.join() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 3. 使用 `concurrent.futures` 模块 `concurrent.futures` 模块是 Python 内置的线程池和进程池模块,可以很方便地实现异步任务。示例代码如下: ```python import concurrent.futures def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建进程池 with concurrent.futures.ProcessPoolExecutor() as executor: # 提交异步任务 future = executor.submit(worker) # 等待任务完成 result = future.result() # 父进程 print('I am parent process, my pid is', os.getpid()) ``` 以上是三种常用的 Python 多进程实现方式,具体选用哪种方式,需要根据实际情况来决定。需要注意的是,在 Windows 平台上,由于 `os.fork()` 不被支持,因此不能使用第一种方式创建多进程。 ### 回答2: Python多进程是指利用Python编程语言提供的多进程模块来实现并行计算。Python的多进程模块主要包括了`multiprocessing`和`concurrent.futures`两个子模块,用于实现多进程的创建、启动和管理。 使用Python的多进程可以带来多个优点。首先,使用多进程可以充分利用多核处理器的计算资源,提高程序的运行效率。其次,多进程可以实现程序的并行计算,将计算任务分配到多个进程中同时执行,从而缩短程序的运行时间。同时,多进程还可以解决Python的全局解释锁(GIL)问题,使得并行计算更加高效。 在Python中,使用多进程可以通过以下几个步骤实现。首先,需要导入`multiprocessing`或`concurrent.futures`模块。然后,通过创建`Process`或`Executor`对象来创建进程。接下来,可以使用`start()`方法启动进程,使用`join()`方法等待进程结束。同时,还可以使用`Process`或`Executor`对象提供的其他方法来管理进程的状态和结果。 除了基本的多进程操作外,Python的多进程模块还提供了一些辅助功能,如进程间通信、进程池等。进程间通信可以通过`Queue`、`Pipe`等来实现,用于实现进程之间的数据交换。而进程池可以通过`Pool`来实现,用于管理多个进程的执行和返回结果。 总之,Python多进程是一种并行计算的方法,可以充分利用计算资源和提高程序的运行效率。通过多进程的方式,可以实现更快速和有效的数据处理和计算。 ### 回答3: Python 多进程是指在一个 Python 程序中同时运行多个进程的能力。多进程可以充分利用多核处理器,并且能够提高程序的运行效率和性能。 在 Python 中,我们可以使用 `multiprocessing` 模块来实现多进程。通过创建多个进程,每个进程都拥有独立的内存空间和数据栈,可以同时运行不同的任务。 使用 `multiprocessing` 模块,我们可以创建一个进程池,通过调用其 `Pool` 类的 `map()` 或 `apply()` 方法,将任务分配给进程池中的不同进程来并行执行。这样,我们可以有效地利用多个 CPU 核心,提高程序的运行效率。 需要注意的是,每个进程都有自己独立的内存空间,因此在多进程编程时,需要特别注意进程间的数据共享和同步问题。在多进程编程中,常用的同步机制包括锁、信号量、事件等,可以通过 `multiprocessing` 模块中的相关类来实现。 此外,多进程编程还可以进一步拓展为分布式进程编程,即将进程分布在多台机器上运行,通过网络进行通信和协调。在 Python 中,可以使用 `multiprocessing` 模块中的 `Manager` 类来实现分布式进程。 总的来说,Python 的多进程编程能够提高程序的执行效率和性能,特别适合于那些需要大量计算的任务,如数据处理、图像处理等。通过合理地运用多进程,并结合适当的同步机制,我们可以充分发挥多核处理器的潜力,提高程序的运行效率和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值