python 多进程

妖狐艹你老母 2022-06-06 11:37 391阅读 0赞

创建一个进程

1,导入模块
2,创建进程
3,启动

进程运行的顺序
严格来说,进程执行没有顺序, 每个进程要去cpu获取执行权限, 随机获取

  1. from time import sleep
  2. #导入进程模块
  3. from multiprocessing import Process
  4. def eat(food,game):
  5. while True:
  6. print('小天才喜欢吃 %s ' % food)
  7. print('小天才喜欢玩 %s' % game)
  8. sleep(1)
  9. def drink(name='water'):
  10. while True:
  11. print('小天才喜欢喝 %s' % name)
  12. sleep(1)
  13. if __name__ == '__main__':
  14. # args Arguments 缩写,单词的意思就是参数
  15. # 参数1 target指定新进程执行的函数,后面不加括号
  16. # 方法(函数)如果后面带有括号,代表执行这个函数
  17. # 参数2 args 指定传递给子进程函数的参数 ,参数需要用元组包装
  18. #创建
  19. eat_process = Process(target=eat,args=('麻辣烫6块的','亡者农药'))
  20. #启动
  21. eat_process.start()
  22. drink_process = Process(target=drink,kwargs={
  23. 'name':'红牛'})
  24. drink_process.start()

进程超时

线程锁超时,我只等你多长时间,过了时间,我就不等你了,我就继续
父进程等待子进程的时间,子进程运行完在执行父进程
如果父进程等待的时间小于子进程运行的时间,不管子进程,先运行父进程,再运行子进程

  1. def eat():
  2. print('子进程启动')
  3. sleep(10)
  4. print('子进程任务完成')
  5. if __name__ == '__main__':
  6. print('父进程启动')
  7. eat_process = Process(target=eat)
  8. eat_process.start()
  9. # timeout 超时,父进程等待子进程的时间节点
  10. # 让父进程等待子进程结束再执行父进程,当子进程结束后,才会执行join后面的方法
  11. eat_process.join(timeout=3)
  12. print('父进程任务完成')

变量的作用域

每个进程都有独立的内存空间
在父进程创建子进程的时候,如果子进程使用了父进程中的变量,
那么子进程会将使用的变量复制一份放到自己的内存中

多进程

默认从上向下一条线式执行的程序,同步执行的
主进程调用子进程启动后,不再关注子进程的执行,直接继续执行自己的逻辑

进程启动数量要选择一个最优的点
程序效率最高的时候,进程数和CPU的核心数一样多

  1. 进程池 Pool
  2. 我们可以将进程放到进程池中去执行
  3. 如果我们创建了一个8个进程的进程池,当我们有多于8个进程放入进程池的时候
  4. 并行执行8个进程,按照放入顺序,多于8个的部分进行排队
  5. 常用的两种数据结构
  6. 先进后出
  7. 队列 先进先出

join之后就不能向进程池中继续添加进程了
进程池调用join,是表示等待子进程都结束后,在调用父进程的代码
再调用join之前,需要调用close方法,调用close之后的父进程不能再添加子进程了

  1. from multiprocessing import Process,Pool
  2. from time import sleep
  3. def say_hello(name):
  4. print('Hello %s' % name)
  5. sleep(1)
  6. print('打招呼完毕')
  7. if __name__ == '__main__':
  8. # 声名一个进程池,,默认是cpu核心数
  9. pp = Pool(4)
  10. for i in range(10):
  11. # 向进程池中添加进程
  12. pp.apply_async(func=say_hello,args=('小强 %d' % i,))
  13. pp.close()
  14. pp.join()

通讯管道

实现两个进程的通信,可以快捷使用管道来实现
Pipe
创建两个进程,由进程A给进程B发消息,由进程B给进程A发消息
这里写图片描述
对列实现多进程

  1. import os
  2. from multiprocessing import Queue, Process
  3. # python中的命名有点杂
  4. from random import random
  5. from time import sleep
  6. def child_send_to_queue(queue):
  7. # 数据的获取,将数据存入队列中 random [0-1)
  8. sleep_time = int(random() * 5 + 5)
  9. sleep(sleep_time)
  10. # 用睡眠模拟 数据获取(从网上下载下来的,数据从数据库中查找出来,或者从文件中查找出来)
  11. # os.getpid() 获取当前进程的id, 在哪一个进程中执行,就获取哪一个进程的id
  12. # 进程不是先创建 就一定先创建完成并执行
  13. print('%d 睡了 %d 秒' % (os.getpid(),sleep_time))
  14. queue.put(sleep_time)
  15. if __name__ == '__main__':
  16. # 查看文档 请去 https://www.python.org/ 右击 翻译为中文
  17. # 初始化数据,分配任务,获取数据 -1 代表无限大
  18. # PID process id 进程ID,每个进程有一个号码,号码唯一
  19. message_queue = Queue()
  20. # 分配任务
  21. for i in range(10):
  22. p = Process(target=child_send_to_queue,args=(message_queue,))
  23. p.start()
  24. # 不断获取数据
  25. while True:
  26. # 不断从队列中取出数据
  27. if message_queue.empty():
  28. print('对列没有数据')
  29. sleep(0.2)
  30. else:
  31. print(message_queue.get())
  32. # 睡眠方便观察,避免直接的死循环
  33. sleep(0.2)

这里写图片描述

发表评论

表情:
评论列表 (有 0 条评论,391人围观)

还没有评论,来说两句吧...

相关阅读

    相关 python 进程

    时间有限: 后面再补充 总结一下就是,多任务的实现有3种方式:多进程模式;多线程模式;多进程+多线程模式。 python中多进程 就是调用模块: multiprocessi

    相关 Python进程进程

    由于Python中线程封锁机制,导致Python中的多线程并不是正真意义上的多线程。当我们有并行处理需求的时候,可以采用多进程迂回地解决。 如果要在主进程中启动大量的子进程,

    相关 Python进程

    Python多进程方面涉及到的模块主要包括: subprocess: 可以在当前程序中执行其他程序或命令 mmap:提供一种基于内存的进程间通信机制 mul