首页 > 系统相关 >Python之进程管理

Python之进程管理

时间:2022-12-26 12:36:34浏览次数:41  
标签:__ task name 管理 Python print p1 进程

使用python创建进程

from multiprocessing import Process		# 导入进程模块
import time

# 定义一个函数,测试创建进程使用
def task(name):
    print(name, '我是一个进程')
    time.sleep(3)
    print(name, '我现在运行完成啦')

# 执行进程,在windows中必须使用这种方法调用,否则会出现循环导入的情况,最终导致报错。
if __name__ == '__main__':
    process1 = Process(target=task, args=('子进程1号说>>>:',))   # 1
    process1.start()		 # 2
    print('我是主进程')		# 3


'''
返回结果:
    我是主进程
    子进程1号说>>>: 我是一个进程
    子进程1号说>>>: 我现在运行完成啦
整个main里面的执行过程说明:
1.创建一个进程对象
2.启动进程,告诉操作系统创建一个新的进程 并在该进程中执行task函数(异步)
3.打印“我是主进程”字符串(同步)
4.执行进程内部的函数体代码
'''

进程间的数据隔离

# 同一台计算机之间的多个进程数据是严格意义上的物理隔离的(在默认情况下)
# 测试代码如下:
from multiprocessing import Process
import time

money = 1000


def task():
    global money
    money = 666
    print('我是子进程task,我在查看变量money>>>:', money)


if __name__ == '__main__':
    print('函数执行前>>>:', money)
    task()
    print('函数执行后>>>:', money)
# 正常执行完以后,money变量被函数中的变量修改,最后变为666
'''
函数执行前>>>: 1000
我是子进程task,我在查看变量money>>>: 666
函数执行后>>>: 666
'''

# 如果我们把上面的执行过程换成进程执行:
if __name__ == '__main__':
    process1 = Process(target=task, )
    process1.start()
    time.sleep(3)
    print(money)   # 看输出结果可以看到,这里并未被函数中的变量修改
'''
此时的函数返回值:
    我是子进程task,我在查看变量money>>>: 666
    1000

这里就说明了什么是进程间的数据隔离
'''

进程join方法

from multiprocessing import Process
import time


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


if __name__ == '__main__':
    process1 = Process(target=task, args=('子进程1号>>>:', 1))
    process2 = Process(target=task, args=('子进程2号>>>:', 2))
    process3 = Process(target=task, args=('子进程3号>>>:', 3))
    start_time = time.time()
    process1.start()
    process2.start()
    process3.start()
    process1.join()
    process2.join()
    process3.join()
    print('我是主进程')
    print('我的执行时间>>>:', time.time() - start_time)
    '''
    返回值:
        子进程1号>>>: is running		# 进程1号占用时间1秒
        子进程2号>>>: is running		# 进程2号占用时间2秒
        子进程3号>>>: is running		# 进程3号占用时间3秒
        子进程1号>>>: is over
        子进程2号>>>: is over
        子进程3号>>>: is over
        我是主进程
        我的执行时间>>>: 3.185295581817627		# 三个进程执行时间为3秒出头
    
    结论:
    	1. 三个子进程执行完成以后,主进程才执行。
    	2. 三个进程并非是执行完一个再执行下一个,都是先创建好并执行函数体代码,但返回值的时候,是一个一个返回。
    '''

进程间通信的方法

'''
根据之前的实验得知,进程间严格意义上说是不能通信的(默认),但是也有方法可以通信(或者说传递数据),那就是使用消息队列,进程将产生的数据放到消息队列中,其他进程再去消息队列中取。
下面初步介绍一下Queue的简单用法:
'''

from multiprocessing import Queue
# 消息队列模块(复习:队列是先进先出,堆栈是先进后出)

# 1. 指定存放数据的个数
q = Queue(3)
# 2. 向消息队列中存放数据
q.put('我是第一个')
# 3. 可以判断队列是否已满
print(q.full())     # 返回False
# 4. 继续向队列中存放数据
q.put('我是第二个')
q.put('我是第三个')
print(q.full())     # 返回True
# 5. 因为在创建对象的时候指定的队列只能存放3个数据,所以再存放第四个的时候会出现等待现象。
# 6. 等待现象什么时候会结束?当有一个数据被取走的时候就对结束等待,将后面的数放入队列中。
# 7. 判断队列是否为空
print(q.empty())    # 返回False

查看进程的多种方法

from multiprocessing import Process, current_process
import os


def task():
    print(current_process())  # <Process name='Process-1' parent=39140 started> (可以看到它的父进程号是39140)
    print(current_process().pid)  # 34064   # 当前进程的进程号(这个是子进程)


# 1.查看进程
if __name__ == '__main__':
    p1 = Process(target=task)
    p1.start()
    print(current_process())  # <_MainProcess name='MainProcess' parent=None started> 
    print(current_process().pid)  # 39140  当前进程的进程号(这个是主进程)
    print(os.getpid())  # 39140    查看此进程的进程号
    print(os.getppid())  # 35544   查看父进程的进程号 (getppid 第一个p就是parent)

# # 2. 终止进程
#
# if __name__ == '__main__':
#     p1 = Process(target=task)
#     p1.start()
#     p1.terminate()  # 终止进程
#
# # 3. 判断进程是否存活
# if __name__ == '__main__':
#     p1 = Process(target=task)
#     p1.start()
#     p1.terminate()  # 终止进程
#     p1.is_alive()
#
# # 4. 创建守护进程
# if __name__ == '__main__':
#     p1 = Process(target=task)
#     p1.daemon = True  # 此时p1的父进程结束,p1不管是否运行完都会结束
#     p1.start()

标签:__,task,name,管理,Python,print,p1,进程
From: https://www.cnblogs.com/smyz/p/17005528.html

相关文章

  • python if语句 5
    1.条件测试cars=['audi','bmw','subaru','toyota']forcarincars:ifcar=='bmw':print(car.upper())else:print(car.title())#......
  • python 字典 6
    1.字典增删改#简单字典用法,用{}表示字典。键和值之间用冒号分隔,而键值对之间用逗号分隔,如下所示alien_0={'color':'green','points':'5'}print(alien_0['color'])#字......
  • python while 7
    1.简单的while示例current_number=1whilecurrent_number<=5:print(current_number)current_number+=1 2.使用标志active=Truenum=1num_end=10w......
  • python 文件操作 11
    一.文件读取操作1.读取整个文件在同级目录,创建一个pi_digits.txt文件和file_reader.py文件。pi_digits.txt文件中加入内容file_reader.py文件内容如下:w......
  • python 异常处理 12
    当python程序在执行期间发生错误时,如果编写了处理该异常的代码,程序将继续运行;如果未对异常进行处理,程序将停止并显示traceback,其中包含有关异常的报告。异常是使用try......
  • python 多版本查看与命令用法
    1.windows查看电脑上是否有多个版本 如果python2能查到,那么用命令时1、pip是python的包管理工具,pip和pip3版本不同,都位于Scripts\目录下:2、如果系统中只安装了Python......
  • Centos7.8误删Python2.7之后,导致yum和Python命令无法使用
    Centos7.8误删Python2.7之后,导致yum和Python命令无法使用先简单介绍下我的情况与背景:我在昨天写一个模块,跑Python脚本报错,由于我不熟习Python2,3之间语法有差异,导致......
  • 盘点五个小而精的项目管理工具(免费,建议收藏)
    1、比牛工作流这是我用过的最好用的工作流管理工具!没用过的绝对要体验一下!比牛主要是针对中、小团队,无论是它的操作逻辑还是交互体验,都可以算作是高水准了,关键还是免费的!(可......
  • python之路56 csrf跨站请求 auth模块登录注册方法
    csrf跨站请求伪造钓鱼网站:模仿一个正规的网站让用户在该网站上做操作但是操作的结果会影响到用户正常的网站账户但是其中有一些猫腻eg:英语四六级考试需要网上先......
  • 内核进程rpciod
      近期在处理cpusoftlockup问题时注意到rpciod进程影响较大,先简单了解下,具体还未找到原因和解决方法rpciod进程简介rpciod进程对应的内核线程共有32个,从rpciod/0到rpci......