• python 进程


    关于进程和子进程,操作系统收到创建进程的命令后,会把当前运行的进程A copy一份成B当做A进程的子进程,A进程是B进程的副进程,但是A和B进程其实是完全一样的。

    子进程返回的值是0, 父进程返回的值是子进程的ID。父进程需要记住每一个子进程的ID

    进程的ID叫做pid,Windows下获取父进程的ID可以通过os.getppid()方法,获取子进程的ID可以通过os.getpid()

    Python 多进程模块 multiprocessing提供了创建子进程的类Process,通过multiprocessing创建的进程,父进程会等待子进程运行完后才结束

    通过Process类创建进程对象,需要传入执行的方法名称和参数

    import os, time, random
    from multiprocessing import Pool
    from multiprocessing import Process

    def run_proc(name):
    print('Run child process %s (%s)' % (name, os.getpid())) # 获取当前的进程id

    if __name__ == '__main__':
    print('Parent process %s' % os.getpid()) # 获取当前的进程ID,就是父进程ID
    p = Process(target=run_proc, args=('test',)) # 创建子进程,传入调用的函数名称和参数
    print('Child process will start')
    p.start() # 启动进程
    p.join() # 等待子进程结束后才结束父进程
    print('Child process end')
    输出:

    Parent process 45304
    Child process will start
    Run child process test (50824)
    Child process end


    通过pool创建多个子进程
    def long_time_task(name):
    print('Run task %s (%s)' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random()*3)
    end = time.time()
    print('Task %s runs %0.2f seconds' % (name, end-start))

    if __name__ == '__main__':
    print('Parend process %s' % os.getpid())
    p = Pool(4) # cpu是几核的就默认可以同时创建几个子进程
    for i in range(5):
    p.apply_async(long_time_task, args=(i,))
    print('Waiting for all subprocesses done')
    p.close()
    p.join()
    print('end')

    输出结果:

    Parend process 36256
    Waiting for all subprocesses done
    Run task 0 (36680)
    Run task 1 (36300)
    Run task 2 (36796)
    Run task 3 (49412)
    Task 2 runs 0.83 seconds
    Run task 4 (36796)
    Task 1 runs 1.16 seconds
    Task 4 runs 0.44 seconds
    Task 0 runs 2.70 seconds
    Task 3 runs 2.88 seconds
    end


    之前一直不理解为什么这句print('Waiting for all subprocesses done')会在子进程之前执行,现在明白了,理解如下:
    这句是需要父进程来执行的,在程序没有遇到p.join()之前,父进程和子进程没有相互等待,父进程也在执行,所以这句话就会先于子进程打印出来。如果把p.join()放在这句print之前,那么这句话就会等到
    子进程全部结束后才会打印出来
    如下:
    import os, time, random
    from multiprocessing import Pool
    from multiprocessing import Process
    def long_time_task(name):
    print('Run task %s (%s)' % (name, os.getpid()))
    start = time.time()
    time.sleep(random.random()*3)
    end = time.time()
    print('Task %s runs %0.2f seconds' % (name, end-start))

    if __name__ == '__main__':
    print('Parend process %s' % os.getpid())
    p = Pool(4) # cpu是几核的就默认可以同时创建几个子进程
    for i in range(5):
    p.apply_async(long_time_task, args=(i,))
    p.close()
    p.join()
    print('Waiting for all subprocesses done')
    print('end')

    输出:





  • 相关阅读:
    在编码转错的情况下,如何恢复
    【娱乐】给你的电脑检查兼容性,并获取你的电脑上安装的软件
    发布一个纯PHP的中文关键字自动提取工具
    [转]程序员能力矩阵 Programmer Competency Matrix
    解决PHP数组内存耗用太多的问题
    哈希表之数学原理
    PHP高级编程之单线程实现并行抓取网页
    如何自动的检测字符串编码
    如何检测网络中断, 并自动重启网卡
    完全二叉树判断,简单而复杂
  • 原文地址:https://www.cnblogs.com/xiaohai2003ly/p/8621802.html
Copyright © 2020-2023  润新知