python-- 启动进程的两种方式

简介: python-- 启动进程的两种方式

进程


进程:

是指正在执行的程序。是程序执行过程中的一次 指令,数据集等的集合。也可以叫做程序的一次执行过程。进程是一个动态的概念。

进程由三大部分组成:代码段,数据段,PCB:进程管理控制

因为有GIL锁的存在,在Cpython中,没有真正的线程并行。但是有真正的多进程并行当你的任务是计算密集的情况下,使用多进程好

总结:在CPython中,IO密集用多线程,计算密集用多进程

进程的三大基本状态:

  • 就绪状态:已经获得运行需要的所有资源,除了CPU
  • 执行状态:已经获得了所有资源包括cpu,处于正在运行
  • 阻塞状态:因为各种原因,进程放弃了cpu,导致进程无法继续执行,此时进程处于内存中,继续等待获取cpu

进程的一个特殊状态:

  • 挂起状态:是指因为种原因,进程放弃了cpu,导致进程无法继续执行,此时进程被踢出内存。

并行 : 两个进程在同一时间点发生

并发 : 两个进程在同一时间间隔内运行

同步 : 某一个任务的执行必须依赖于另一个任务的返回结果

异步 : 某一个任务的执行,不需要依赖于另一个任务的返回,只需要告诉另一个任务一声

阻塞 : 程序因为类似于IO等待、等待事件等导致无法继续执行。

非阻塞:程序遇到类似于IO操作时,不再阻塞等待,如果没有及时的处理IO,就报错或者跳过等其他操作


启动进程的两种方式


程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程。程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本;进程是程序的一次执行活动,属于动态概念。

  • 进程只能在一个时间干一件事,如果想同时干两件事或多件事,进程就无能为力了。
  • 进程在执行的过程中如果阻塞,例如等待输入input,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行。

第一种方式

import os
import time
from multiprocessing import Process
def func(n):
    time.sleep(5)
    print('这里是子进程,子进程的pid是%s,父进程的pid是%s' % (os.getpid(), os.getppid()))
if __name__ == '__main__':
    p = Process(target=func, args=(1,))  # 实例化一个进程对象
    p.start()  # 开启一个子进程
    print('这里是父进程,父进程的pid是%s,父父的pid是%s' % (os.getpid(), os.getppid()))

结果

这里是父进程,父进程的pid是3620,父父的pid是2762
这里是子进程,子进程的pid是3621,父进程的pid是3620

os.getpid()获取的是当前进程自己的pid

os.getppid()获取的是当前进程的父进程的pid

第二种方式,继承的方式

from multiprocessing import Process
class MyProcess(Process):
    def __init__(self):
        super(MyProcess, self).__init__()
    def run(self):
        print('这是以继承类的方式开启的子进程')
if __name__ == '__main__':
    p1 = MyProcess()
    p1.start()  # 是指,解释器告诉操作系统,去帮我开启一个进程,就绪状态,方法必须为run
    # p1.run()# 告诉操作系统,现在马上帮我执行这个子进程 执行

结果:

这是以继承类的方式开启的子进程
import multiprocessing, time
def run(n):
    time.sleep(2)
    print('%s in the run...' % n)
if __name__ == '__main__':
    for i in range(5):
        m = multiprocessing.Process(target=run,args=(i,))
        m.start()

结果

0 in the run...
1 in the run...
2 in the run...
3 in the run...
4 in the run...

2秒后一起执行的


相关文章
|
5天前
|
并行计算 数据处理 调度
Python中的并发编程:探索多线程与多进程的奥秘####
本文深入探讨了Python中并发编程的两种主要方式——多线程与多进程,通过对比分析它们的工作原理、适用场景及性能差异,揭示了在不同应用需求下如何合理选择并发模型。文章首先简述了并发编程的基本概念,随后详细阐述了Python中多线程与多进程的实现机制,包括GIL(全局解释器锁)对多线程的影响以及多进程的独立内存空间特性。最后,通过实例演示了如何在Python项目中有效利用多线程和多进程提升程序性能。 ####
|
17天前
|
调度 iOS开发 MacOS
python多进程一文够了!!!
本文介绍了高效编程中的多任务原理及其在Python中的实现。主要内容包括多任务的概念、单核和多核CPU的多任务实现、并发与并行的区别、多任务的实现方式(多进程、多线程、协程等)。详细讲解了进程的概念、使用方法、全局变量在多个子进程中的共享问题、启动大量子进程的方法、进程间通信(队列、字典、列表共享)、生产者消费者模型的实现,以及一个实际案例——抓取斗图网站的图片。通过这些内容,读者可以深入理解多任务编程的原理和实践技巧。
41 1
|
24天前
|
Python
Python中的多线程与多进程
本文将探讨Python中多线程和多进程的基本概念、使用场景以及实现方式。通过对比分析,我们将了解何时使用多线程或多进程更为合适,并提供一些实用的代码示例来帮助读者更好地理解这两种并发编程技术。
|
1月前
|
数据挖掘 程序员 调度
探索Python的并发编程:线程与进程的实战应用
【10月更文挑战第4天】 本文深入探讨了Python中实现并发编程的两种主要方式——线程和进程,通过对比分析它们的特点、适用场景以及在实际编程中的应用,为读者提供清晰的指导。同时,文章还介绍了一些高级并发模型如协程,并给出了性能优化的建议。
30 3
|
2月前
|
负载均衡 Java 调度
探索Python的并发编程:线程与进程的比较与应用
本文旨在深入探讨Python中的并发编程,重点比较线程与进程的异同、适用场景及实现方法。通过分析GIL对线程并发的影响,以及进程间通信的成本,我们将揭示何时选择线程或进程更为合理。同时,文章将提供实用的代码示例,帮助读者更好地理解并运用这些概念,以提升多任务处理的效率和性能。
60 3
|
1月前
|
存储 Python
Python中的多进程通信实践指南
Python中的多进程通信实践指南
19 0
|
2月前
|
消息中间件 安全 Kafka
Python IPC机制全攻略:让进程间通信变得像呼吸一样自然
【9月更文挑战第12天】在编程领域,进程间通信(IPC)是连接独立执行单元的关键技术。Python凭借简洁的语法和丰富的库支持,提供了多种IPC方案。本文将对比探讨Python的IPC机制,包括管道与消息队列、套接字与共享内存。管道适用于简单场景,而消息队列更灵活,适合高并发环境。套接字广泛用于网络通信,共享内存则在本地高效传输数据。通过示例代码展示`multiprocessing.Queue`的使用,帮助读者理解IPC的实际应用。希望本文能让你更熟练地选择和运用IPC机制。
57 10
|
2月前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
42 1
|
1月前
|
数据采集 消息中间件 Python
Python爬虫-进程间通信
Python爬虫-进程间通信
|
2月前
|
安全 开发者 Python
Python IPC大揭秘:解锁进程间通信新姿势,让你的应用无界连接
【9月更文挑战第11天】在编程世界中,进程间通信(IPC)如同一座无形的桥梁,连接不同进程的信息孤岛,使应用无界而广阔。Python凭借其丰富的IPC机制,让开发者轻松实现进程间的无缝交流。本文将揭开Python IPC的神秘面纱,介绍几种关键的IPC技术:管道提供简单的单向数据传输,适合父子进程间通信;队列则是线程和进程安全的数据共享结构,支持多进程访问;共享内存允许快速读写大量数据,需配合锁机制确保一致性;套接字则能实现跨网络的通信,构建分布式系统。掌握这些技术,你的应用将不再受限于单个进程,实现更强大的功能。
66 6

热门文章

最新文章