python并发编程02/多进程

目录

  • python并发编程02/多进程

    • 1.进程创建的两种方式

      • 1.1开启进程的第一种方式
      • 1.2开启进程的第二种方式
      • 1.3简单应用
    • 2.进程pid
      • 2.1命令行获取所有的进程的pid tasklist
      • 2.2代码级别如何获取一个进程的pid
      • 2.3获取父进程(主进程)的pid
    • 3.验证进程之间的空间隔离
    • 4.进程对象join方法
    • 5.进程对象其他属性
    • 6.守护进程

python并发编程02/多进程

1.进程创建的两种方式

1.1开启进程的第一种方式

from multiProcessing import Process
import time
def task(name):
    print(f'{name} is running')
    time.sleep(2)
    print(f'{name} is gone')
if __name__ == '__main__':
    #在window环境下,开启进程必须__name=='__main__'下面
    p = Process(target=task,args=('太阳',)) #创建一个进程对象
    p.start() #只是向操作系统发出一个开辟子进程的信号,然后就执行下一行了
#这个信号操作系统接收到之后,会从内存中开辟子进程空间,然后再将主进程所有数据copy加载到子进程,然后再调用CPU去执行.
    #开辟子进程开销是很大的
    print('==主开始')
    time.sleep(3)
    #所以永远会先执行主进程的代码

1.2开启进程的第二种方式

# from multiprocessing import Process
# import time
#
# class MyProcess(Process):
#
#     def __init__(self,name):
#         super().__init__()
#         self.name = name
#
#     def run1(self):
#         print(f'{self.name} is running')
#         time.sleep(2)
#         print(f'{self.name} is gone')
#
#
# if __name__ == '__main__':
#     p = MyProcess('太阳')
#     p.start()
#     print('===主')

1.3简单应用

# from multiprocessing import Process
# import time
#
# def task(name):
#     print(f'{name} is running')
#     time.sleep(1)
#     print(f'{name} is gone')
#
# def task1(name):
#     print(f'{name} is running')
#     time.sleep(2)
#     print(f'{name} is gone')
#
# def task2(name):
#     print(f'{name} is running')
#     time.sleep(3)
#     print(f'{name} is gone')
#
#
# if __name__ == '__main__':
#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面

#     # 一个进程串行的执行三个任务
#     start_time = time.time()
#     task('太阳')
#     task1('月亮')
#     task2('星星')
#     print(f'结束时间{time.time() - start_time}')
    # 三个进程 并发或者并行的执行三个任务
    # start_time = time.time()
    # p1 = Process(target=task, args=('太阳',))  # 创建一个进程对象
    # p2 = Process(target=task1, args=('月亮',))# 创建一个进程对象
    # p1.start()
    # p2.start()
    # task2('星星')
    # print(f'结束时间{time.time()-start_time}')

2.进程pid

2.1命令行获取所有的进程的pid tasklist

2.2代码级别如何获取一个进程的pid

import os
print(os.getpid())

2.3获取父进程(主进程)的pid

import os
import time
print(f'子进程:{os.getpid()}')
print(f'主(父)进程:{os.getppid(())}')

3.验证进程之间的空间隔离

#from multiprocessing import Process
#import os
#import time
# name = 'dabai'
#
# def task():
#     global name
#     name = 'ergou'
#     print(f'子进程{name}')
#
#
# if __name__ == '__main__':
#     p = Process(target=task)  # 创建一个进程对象
#     p.start()
#     # print('==主开始')
#     time.sleep(3)
#     print(f'主:{name}')

4.进程对象join方法

join让主进程等待子进程结束后,再执行主进程
# from multiprocessing import Process
# import time
#
# def task(name):
#     print(f'{name} is running')
#     time.sleep(2)
#     print(f'{name} is gone')
#
#
#
# if __name__ == '__main__':
#
#     p = Process(target=task,args=('太阳',))  # 创建一个进程对象
#     p.start()
#     p.join()
#     print('==主开始')

多个子进程使用join
# from multiprocessing import Process
# import time
#
# def task(name,sec):
#     print(f'{name}is running')
#     time.sleep(sec)
#     print(f'{name} is gone')
#
#
# if __name__ == '__main__':
#     start_time = time.time()
#     p1 = Process(target=task,args=('太阳',1))
#     p2 = Process(target=task,args=('月亮',2))
#     p3 = Process(target=task,args=('星星',3))
#     p1.start()
#     p2.start()
#     p3.start()
#     print(f'==主{time.time()-start_time}')  # 0.02 这只是主进程结束的时间,与其他进程毫无关系

验证 1
# from multiprocessing import Process
# import time
#
# def task(name,sec):
#     print(f'{name}is running')
#     time.sleep(sec)
#     print(f'{name} is gone')
#
#
# if __name__ == '__main__':
#     start_time = time.time()
#     p1 = Process(target=task,args=('太阳',1))
#     p2 = Process(target=task,args=('月亮',2))
#     p3 = Process(target=task,args=('星星',3))
#
#     p1.start()
#     p2.start()
#     p3.start()
#     # join 只针对主进程,如果join下面多次join 他是不阻塞的.
#     p1.join()
#     p2.join()
#     p3.join()
#
#     print(f'==主{time.time()-start_time}')

验证 2
# from multiprocessing import Process
# import time
#
# def task(name,sec):
#     print(f'{name}is running')
#     time.sleep(sec)
#     print(f'{name} is gone')
#
#
# if __name__ == '__main__':
#     start_time = time.time()
#     p1 = Process(target=task,args=('太阳',3))
#     p2 = Process(target=task,args=('月亮',2))
#     p3 = Process(target=task,args=('星星',1))
#
#     p1.start()
#     p2.start()
#     p3.start()
#     # join就是阻塞
#
#     p1.join()  # 等2s
#     print(f'==主1:{time.time()-start_time}')
#     p2.join()
#     print(f'===主2:{time.time()-start_time}')
#     p3.join()
#     print(f'==主3:{time.time()-start_time}')  #

优化上面的方法
# from multiprocessing import Process
# import time
#
# def task(sec):
#     print(f'is running')
#     time.sleep(sec)
#     print(f' is gone')
#
#
# if __name__ == '__main__':
#     start_time = time.time()
    # p1 = Process(target=task,args=(1,))
    # p2 = Process(target=task,args=(2,))
    # p3 = Process(target=task,args=(3,))
    #
    # p1.start()
    # p2.start()
    # p3.start()
    # # join 只针对主进程,如果join下面多次join 他是不阻塞的.
    # p1.join()
    # p2.join()
    # p3.join()

    错误示范:
    # for i in range(1,4):
    #     p = Process(target=task,args=(i,))
    #     p.start()
    #     p.join()
    # '''
    # p1 = Process(target=task,args=(1,))
    # p1.start()
    # p1.join()
    # p2 = Process(target=task,args=(2,))
    # p2.start()
    # p2.join()
    # p3 = Process(target=task,args=(3,))
    # p3.start()
    # p3.join()
    #
    # '''

    正确示范:
    # l1 = []
    # for i in range(1, 4):
    #     p = Process(target=task,args=(i,))
    #     l1.append(p)
    #     p.start()
    #
    # for i in l1:
    #     i.join()
    #
    # print(f'==主{time.time()-start_time}')

join就是阻塞,主进程有join,主进程下面的代码一律不执行,直到进程执行完毕之后,在执行.

5.进程对象其他属性

# from multiprocessing import Process
# import time
#
# def task(name):
#     print(f'{name} is running')
#     time.sleep(2)
#     print(f'{name} is gone')
#
#
# if __name__ == '__main__':
#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面
#     # p = Process(target=task,args=('太阳',))  # 创建一个进程对象
#     p = Process(target=task,args=('太阳',),name='月亮')  # 创建一个进程对象
#     p.start()
#     # time.sleep(1)
#     # p.terminate()  # 杀死子进程  ***
#     # p.join()  # ***
#     # time.sleep(0.5)
#     # print(p.is_alive())   # ***
#     # print(p.name)
#     p.name = 'sb'
#     print(p.name)
#     print('==主开始')

6.守护进程

# 古时候 太监守护这个皇帝,如果皇帝驾崩了,太监直接也就死了.
子进程守护着主进程,只要主进程结束,子进程就跟着结束

# from multiprocessing import Process
# import time
#
# def task(name):
#     print(f'{name} is running')
#     time.sleep(2)
#     print(f'{name} is gone')
#
# if __name__ == '__main__':
#     # 在windows环境下, 开启进程必须在 __name__ == '__main__' 下面
#     p = Process(target=task,args=('太阳',))  # 创建一个进程对象
#     p.daemon = True  # 将p子进程设置成守护进程,只要主进程结束,守护进程马上结束.
#     p.start()
#     # p.daemon = True  # 一定要在子进程开启之前设置
#     time.sleep(1)
#     print('===主')

原文地址:https://www.cnblogs.com/liubing8/p/11386143.html

时间: 2024-08-08 17:21:25

python并发编程02/多进程的相关文章

python并发编程之多进程

python并发编程之多进程 一.什么是进程 进程:正在进行的一个过程或者一个任务,执行任务的是CPU. 原理:单核加多道技术 二.进程与程序的区别 进程是指程序的运行过程 需要强调的是:同一个程序执行两次是两个进程,比如打开暴风影音,虽然都是同一个软件,但是一个可以播放苍井空,另一个可以播放武藤兰. 三.并发与并行 无论是并行还是并发,在用户看来都是'同时'运行的,不管是进程还是线程,都只是一个任务而已,真是干活的是cpu,cpu来做这些任务,而一个cpu同一时刻只能执行一个任务. (1)并发

进程,操作系统,Python并发编程之多进程

1.进程基础知识 1.程序:若干文件 2.进程:一个正在执行的文件,程序 3.进程被谁执行:cpu最终运行指定的程序 4.操作系统调度作用:将磁盘上的程序加载到内存,然后交由CPU去处理,一个CPU正在运行的一个程序,就叫开启了一个进程 2.操作系统 1.操作系统:存在于硬盘与软件之间,管理.协调.控制软件与硬件的交互 2.操作系统的作用:将一些复杂的硬件封装成简单的借口,便于使用;合理地调度分配多个进程与cpu的关系,让其有序化 3.操作系统发展史 ①第一代电子计算机(1940-1955) 二

python-学习-python并发编程之多进程与多线程

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似.  multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,

二 python并发编程之多进程-重点

一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开启子进程,并在子进程中执行我们定制的任务(比如函数),该模块与多线程模块threading的编程接口类似.  multiprocessing模块的功能众多:支持子进程.通信和共享数据.执行不同形式的同步,

python并发编程之多进程(二):互斥锁(同步锁)&进程其他属性&进程间通信(queue)&生产者消费者模型

一,互斥锁,同步锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 竞争带来的结果就是错乱,如何控制,就是加锁处理 part1:多个进程共享同一打印终端 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('

python并发编程之多进程1------互斥锁与进程间的通信

一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全. 1.上厕所的小例子:你上厕所的时候肯定得锁门吧,有人来了看见门锁着,就会在外面等着,等你吧门开开出来的时候,下一个人才去上厕所. 1 from multiprocessing import Process,Lock 2 import os 3

二 python并发编程之多进程实现

一 multiprocessing模块介绍 二 process类的介绍 三 process类的使用 四 守护进程 五 进程同步(锁) 六 队列 七 管道 八 共享数据 九 信号量 十 事件 十一 进程池 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.Python提供了multiprocessing.    multiprocessing模块用来开

python并发编程之多进程理论

一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例:单核+多道,实现多个进程的并发执行 你在一个时间段内有很多任务要做:写python程序,打游戏,逛淘宝 但你同一时刻只能做一个任务(cpu同一时间只能干一个活),如何才能玩出多个任务并发执行的效果? 你可以写一会python程序,然后打会游戏,再逛淘宝这就保证了每个任务都在进行中. 二.进程与程序的区别 程序仅仅只是一堆代码而已,而进程指的是程序的运行过程. 举例:想象一位有一手好厨艺的计算机科学家正在为他

一 python并发编程之多进程

一 进程与程序 二 并发与并行 三 同步\异步和阻塞\非阻塞 四 进程的创建 五 进程的终止 六 进程的层次结构 七 进程的状态 八 进程并发的实现 一 进程与程序 什么是进程: 进程的概念:我们知道操作系统最核心的概念就是进程.其实进程简单来说就是在操作系统中运行的程序,它是操作系统资源管理的最小单位.但是进程是一个动态的实体,它是程序的一次执行过程.进程和程序的区别在于:进程是动态的,程序是静态的,进程是运行中的程序,而程序是一些保存在硬盘上的可执行代码. 在Linux下面,可以通过命令ps