开启子进程的两种方式,以及join方法

方式一

在windows系统上,开启子进程的操作必须放到:

if name == 'main':的子代码中

from multiprocessing import Process
import time


def task(name):
    print('%s is running...' % name)
    time.sleep(3)
    print('%s is done' % name)


if __name__ == '__main__':
    p = Process(target=task, args=('子进程...',))
    p.start()
    print('主进程...')

方式二

from multiprocessing import Process
import time


class MyProcess(Process):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s is running...' % self.name)
        time.sleep(3)
        print('%s is done' % self.name)


if __name__ == '__main__':
    p = MyProcess('子进程...')
    p.start()
    print('主进程...')

join方法

join:让主进程在原地等待,等待子进程运行完毕,不会影响子进程的执行
from multiprocessing import Process
import time

def task(name,n):
    print('%s is running' %name)
    time.sleep(n)
    print('%s is done' %name)

if __name__ == '__main__':
    """
    p1=Process(target=task,args=('子1',1))
    p2=Process(target=task,args=('子2',2))
    p3=Process(target=task,args=('子3',3))

    start=time.time()
    p1.start()
    p2.start()
    p3.start()

    p3.join()
    p1.join()
    p2.join()
    print('主',(time.time()-start))
    """
    start=time.time()
    p_l=[]
    for i in range(1,4):
        p = Process(target=task, args=('子%s' %i, i))
        p_l.append(p)
        p.start()

    for p in p_l:
        p.join()
    print('主', (time.time() - start))

验证:进程之间内存空间相互隔离

from multiprocessing import Process

n=100
def task():
    global n
    n=0

if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    p.join()
    print(n)

打印 n 发现 n 的值还是为100 ,说明子进程内的更改并不会影响到主进程的内存空间,也就是说明了进程之间的内存空间相互隔离

进程对象其他相关的属性或方法

1. 进程pid:每一个进程在操作系统内都有一个唯一的id号,称之为pid
from multiprocessing import Process,current_process
import time

def task():
    print('%s is running' %current_process().pid)
    time.sleep(30)
    print('%s is done' %current_process().pid)

if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('主',current_process().pid)

上下两种不同的写法

from multiprocessing import Process,current_process
import time,os

def task():
    print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
    time.sleep(30)
    print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))


if __name__ == '__main__':
    p=Process(target=task)
    p.start()
    print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
2. 进程对象其他相关的属性或方法
from multiprocessing import Process,current_process
import time,os

def task():
    print('%s is running 爹是:%s' %(os.getpid(),os.getppid()))
    time.sleep(30)
    print('%s is done 爹是:%s' %(os.getpid(),os.getppid()))


if __name__ == '__main__':
    p=Process(target=task,name='子进程1')
    p.start()
    # print(p.name)
    p.terminate()
    # time.sleep(0.1)
    print(p.is_alive())
    print('主:%s 主他爹:%s' %(os.getpid(),os.getppid()))
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、C语言基础 1、struct 的内存对齐和填充问题其实只要记住一个概念和三个原则就可以了: 一个概念:自然对齐...
    XDgbh阅读 2,369评论 1 38
  • 1.内存的页面置换算法 (1)最佳置换算法(OPT)(理想置换算法):从主存中移出永远不再需要的页面;如无这样的...
    杰伦哎呦哎呦阅读 3,634评论 1 9
  • 亲爱的清馨 第一封信写给您 您是最懂我的人 也是最了解我的人 你是我的好闺密 也是我的好姐妹 我是最崇拜您的人 也...
    爱粉阅读 312评论 4 8
  • 本文译自medium上由UX Design Collective发布的系列文章,该系列共有九篇,本次为第五篇。 系...
    7win7阅读 275评论 0 2
  • 我一听气吐干净了就能沉到水里,一下来情绪了,站起来,跑到潜水那边自己偷偷去试了一下,谁也没注意我,我跳到水里后吐气...
    水东方阅读 380评论 1 0

友情链接更多精彩内容