并发进程——Process对象的方法属性

本文探讨了并发编程中的Process对象,重点介绍了join方法的作用,它允许主进程等待子进程执行完毕后再继续。通过示例,解释了join方法在并行和串行执行中的差异,揭示了并发执行的本质。此外,还提到了terminate方法用于发送信号关闭进程,以及is_alive属性用于检查进程状态,以及name和pid属性用于获取进程名称和ID。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

join方法

让主进程检测子进程是否运行完毕,在子进程执行完毕后才继续执行,否则一直在原地阻塞

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

if __name__ == '__main__':
    p1 = Process(target=test, args=('p1',))
    p1.start()
    p1.join()  # 主程序检测等待
    print('主进程')


# p1 is running
# done
# 主进程


没有join之前的:
# 主进程
# p1 is running
# done

再看一个,检测下多个子进程的并行还是串行:如果是串行,等待一个子进程结束之后再运行,那运行时间应该是总和,如果是并行,那运行时间应该是时间最长的那个。

def test(name, n):
    print('%s is running' % name)
    time.sleep(n)  # 每个子进程睡眠时间
    print('done')

if __name__ == '__main__':
    start = time.time()  #记录下初始时间
    p1 = Process(target=test, args=('p1', 3))
    p2 = Process(target=test, args=('p2', 5))
    p3 = Process(target=test, args=('p3', 2))
    p1.start()
    p2.start()
    p3.start()
    p1.join()
    p2.join()
    p3.join()
    print('主进程')
    print(time.time()-start)  # 记录运行时间



# p1 is running
# p2 is running
# p3 is running
# done
# done
# done
# 主进程
# 5.219203472137451

由此看出,join方法是让主进程检测等待,而三个子进程向操作系统发送信号之后是并发执行的。如果是下面这种情况,则是串行的:


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

if __name__ == '__main__':
    start = time.time()
    p1 = Process(target=test, args=('p1', 3))
    p2 = Process(target=test, args=('p2', 5))
    p3 = Process(target=test, args=('p3', 2))
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    print('主进程')
    print(time.time()-start)


# p1 is running
# done
# p2 is running
# done
# p3 is running
# done
# 主进程
# 10.628840684890747

进程对象的其他方法一:terminate与is_alive

terminate 发信号给操作系统关闭进程,操作系统需要反应时间,不会立即关闭,用 is_alive查看是否还在,返回True 或False

进程对象的其他属性:name与pid

name查看属性名,pid查看进程号

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

if __name__ == '__main__':
    start = time.time()
     p1 = Process(target=test, args=('p1', 3),name='子进程1')
    ) #可以用关键参数来指定进程名
    p1.start()

    print(p1.name,p1.pid,)
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值