前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多线程 VS 多进程(三)

多线程 VS 多进程(三)

原创
作者头像
ruochen
修改2021-05-11 14:39:11
3100
修改2021-05-11 14:39:11
举报

线程替代方案

  • subprocess
    • 完全跳过线程,使用进程
    • 是派生进程的主要替代方案
    • python2.4后引入
  • multiprocessiong
    • 使用threading接口派生,使用子进程
    • 允许为多核或者多cpu派生进程,接口跟threading非常相似
    • python2.6后引入
  • concurrent.futures - 新的异步执行模块 - 任务级别的操作 - python3.2后引入多进程
  • 进程间通讯(InterprocessCommunication, IPC)
  • 进程之间无任何共享状态
  • 进程的创建
    • 直接生成Process实例对象,案例19 ```python import multiprocessing from time import sleep, ctime
代码语言:txt
复制
	def clock(interval):
代码语言:txt
复制
	    while True:
代码语言:txt
复制
	        print("The time is %s" % ctime())
代码语言:txt
复制
	        sleep(interval)
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    p = multiprocessing.Process(target=clock, args=(5, ))
代码语言:txt
复制
	    p.start()
代码语言:txt
复制
	    while True:
代码语言:txt
复制
	        print("sleeping......")
代码语言:txt
复制
	        sleep(1)
代码语言:txt
复制
    ```
代码语言:txt
复制
	    sleeping......
代码语言:txt
复制
		The time is Tue Aug 13 19:47:41 2019
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		The time is Tue Aug 13 19:47:46 2019
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		sleeping......
代码语言:txt
复制
		...
代码语言:txt
复制
- 派生子类,案例20
    ```python
    import multiprocessing
	from time import sleep, ctime
	
代码语言:txt
复制
	class ClockProcess(multiprocessing.Process):
代码语言:txt
复制
	    '''
代码语言:txt
复制
	    两个函数比较重要
代码语言:txt
复制
	    1. init构造函数
	    2. run
	    '''
	    def __init__(self, interval):
	        super(ClockProcess, self).__init__()
	        self.interval = interval
	    def run(self):
	        while True:
	            print("The time is %s" % ctime())
	            sleep(self.interval)
	
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    p = ClockProcess(3)
代码语言:txt
复制
	    p.start()
代码语言:txt
复制
    ```
代码语言:txt
复制
	    The time is Tue Aug 13 19:48:49 2019
代码语言:txt
复制
		The time is Tue Aug 13 19:48:52 2019
代码语言:txt
复制
		The time is Tue Aug 13 19:48:55 2019
代码语言:txt
复制
		The time is Tue Aug 13 19:48:58 2019
代码语言:txt
复制
		The time is Tue Aug 13 19:49:01 2019
代码语言:txt
复制
		The time is Tue Aug 13 19:49:04 2019
代码语言:txt
复制
		...
  • 在os中查看pid,ppid以及他们的关系
    • 案例21 ```python from multiprocessing import Process import os
代码语言:txt
复制
	def info(title):
代码语言:txt
复制
	    print(title)
代码语言:txt
复制
	    print("module name:", __name__)
代码语言:txt
复制
	    # 得到父亲进程的id
代码语言:txt
复制
	    print("parent process:", os.getppid())
代码语言:txt
复制
	    # 得到本身进程的id
代码语言:txt
复制
	    print("process id:", os.getpid())
代码语言:txt
复制
	def f(name):
代码语言:txt
复制
	    info('function f')
代码语言:txt
复制
	    print('hello', name)
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    info('main line')
代码语言:txt
复制
	    p = Process(target=f, args=('bob', ))
代码语言:txt
复制
	    p.start()
代码语言:txt
复制
	    p.join()
代码语言:txt
复制
    ```
代码语言:txt
复制
	    main line
代码语言:txt
复制
		module name: __main__
代码语言:txt
复制
		parent process: 11900
代码语言:txt
复制
		process id: 18832
代码语言:txt
复制
		function f
代码语言:txt
复制
		module name: __mp_main__
代码语言:txt
复制
		parent process: 18832
代码语言:txt
复制
		process id: 20868
代码语言:txt
复制
		hello bob
  • 生产者消费者模型
    • JoinableQueue
    • 案例22 ```python import multiprocessing from time import ctime
代码语言:txt
复制
	def consumer(input_q):
代码语言:txt
复制
	    print("Into consumer:", ctime)
代码语言:txt
复制
	    while True:
代码语言:txt
复制
	        # 处理项
代码语言:txt
复制
	        item = input_q.get()
代码语言:txt
复制
	        print('pull', item, 'out of q')
代码语言:txt
复制
	        input_q.task_done()  # 发出信号通知任务完成
代码语言:txt
复制
	    print("Out of consumer:", ctime()) ## 此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动,未等到print此句完成,程序就结束了
代码语言:txt
复制
	def producer(sequence, output_q):
代码语言:txt
复制
	    print("Into procuder:", ctime())
代码语言:txt
复制
	    for item in sequence:
代码语言:txt
复制
	        output_q.put(item)
代码语言:txt
复制
	        print('put', item, 'into q')
代码语言:txt
复制
	    print('Out of procuder', ctime())
代码语言:txt
复制
	# 建立进程
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    q = multiprocessing.JoinableQueue()
代码语言:txt
复制
	    # 进行消费者进程
代码语言:txt
复制
	    cons_p = multiprocessing.Process(target=consumer, args=(q, ))
代码语言:txt
复制
	    cons_p.daemon = True
代码语言:txt
复制
	    cons_p.start()
代码语言:txt
复制
	    # 生产多个项,sequence代表要发送给消费者的项序列
代码语言:txt
复制
	    # 在实践中,这可能是生成器的输出或通过一些其他地方生产出来
代码语言:txt
复制
	    sequence = [1, 2, 3, 4]
代码语言:txt
复制
	    producer(sequence, q)
代码语言:txt
复制
	    # 等待所有项被处理
代码语言:txt
复制
	    q.join()
代码语言:txt
复制
    ```
代码语言:txt
复制
	    Into procuder: Tue Aug 13 19:50:38 2019
代码语言:txt
复制
		put 1 into q
代码语言:txt
复制
		put 2 into q
代码语言:txt
复制
		put 3 into q
代码语言:txt
复制
		put 4 into q
代码语言:txt
复制
		Out of procuder Tue Aug 13 19:50:38 2019
代码语言:txt
复制
		Into consumer: <built-in function ctime>
代码语言:txt
复制
		pull 1 out of q
代码语言:txt
复制
		pull 2 out of q
代码语言:txt
复制
		pull 3 out of q
代码语言:txt
复制
		pull 4 out of q
代码语言:txt
复制
- 队列中哨兵的使用,案例23
    ```python
    import multiprocessing
	from time import ctime
	
代码语言:txt
复制
	# 设置哨兵问题
代码语言:txt
复制
	def consumer(input_q):
代码语言:txt
复制
	    print("Into consumer:", ctime())
代码语言:txt
复制
	    while True:
代码语言:txt
复制
	        item = input_q.get()
代码语言:txt
复制
	        if item is None:
代码语言:txt
复制
	            break
代码语言:txt
复制
	        print("pull", item, "out of q")
代码语言:txt
复制
	    print ("Out of consumer:", ctime()) ## 此句执行完成,再转入主进程
代码语言:txt
复制
	def producer(sequence, output_q):
代码语言:txt
复制
	    print ("Into procuder:", ctime())
代码语言:txt
复制
	    for item in sequence:
代码语言:txt
复制
	        output_q.put(item)
代码语言:txt
复制
	        print ("put", item, "into q")
代码语言:txt
复制
	    print ("Out of procuder:", ctime())
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    q = multiprocessing.Queue()
代码语言:txt
复制
	    cons_p = multiprocessing.Process(target = consumer, args = (q,))
代码语言:txt
复制
	    cons_p.start()
代码语言:txt
复制
	    sequence = [1,2,3,4]
代码语言:txt
复制
	    producer(sequence, q)
代码语言:txt
复制
	    q.put(None)
代码语言:txt
复制
	    cons_p.join()
代码语言:txt
复制
    ```
代码语言:txt
复制
	    Into procuder: Tue Aug 13 19:51:23 2019
代码语言:txt
复制
		put 1 into q
代码语言:txt
复制
		put 2 into q
代码语言:txt
复制
		put 3 into q
代码语言:txt
复制
		put 4 into q
代码语言:txt
复制
		Out of procuder: Tue Aug 13 19:51:23 2019
代码语言:txt
复制
		Into consumer: Tue Aug 13 19:51:24 2019
代码语言:txt
复制
		pull 1 out of q
代码语言:txt
复制
		pull 2 out of q
代码语言:txt
复制
		pull 3 out of q
代码语言:txt
复制
		pull 4 out of q
代码语言:txt
复制
		Out of consumer: Tue Aug 13 19:51:24 2019
代码语言:txt
复制
- 哨兵的改进,案例24
    ```python
    import multiprocessing
	from time import ctime
	
代码语言:txt
复制
	def consumer(input_q):
代码语言:txt
复制
	    print ("Into consumer:", ctime())
代码语言:txt
复制
	    while True:
代码语言:txt
复制
	        item = input_q.get()
代码语言:txt
复制
	        if item is None:
代码语言:txt
复制
	            break
代码语言:txt
复制
	        print("pull", item, "out of q")
代码语言:txt
复制
	    print ("Out of consumer:", ctime())
代码语言:txt
复制
	def producer(sequence, output_q):
代码语言:txt
复制
	    for item in sequence:
代码语言:txt
复制
	        print ("Into procuder:", ctime())
代码语言:txt
复制
	        output_q.put(item)
代码语言:txt
复制
	        print ("Out of procuder:", ctime())
代码语言:txt
复制
	if __name__ == '__main__':
代码语言:txt
复制
	    q = multiprocessing.Queue()
代码语言:txt
复制
	    cons_p1 = multiprocessing.Process (target = consumer, args = (q,))
代码语言:txt
复制
	    cons_p1.start()
代码语言:txt
复制
	    cons_p2 = multiprocessing.Process (target = consumer, args = (q,))
代码语言:txt
复制
	    cons_p2.start()
代码语言:txt
复制
	    sequence = [1,2,3,4]
代码语言:txt
复制
	    producer(sequence, q)
代码语言:txt
复制
	    q.put(None)
代码语言:txt
复制
	    q.put(None)
代码语言:txt
复制
	    cons_p1.join()
代码语言:txt
复制
	    cons_p2.join()
代码语言:txt
复制
    ```
代码语言:txt
复制
	    Into procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Out of procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Into procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Out of procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Into procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Out of procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Into procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Out of procuder: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Into consumer: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		pull 1 out of q
代码语言:txt
复制
		pull 2 out of q
代码语言:txt
复制
		pull 3 out of q
代码语言:txt
复制
		pull 4 out of q
代码语言:txt
复制
		Out of consumer: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Into consumer: Tue Aug 13 19:52:08 2019
代码语言:txt
复制
		Out of consumer: Tue Aug 13 19:52:08 2019

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 线程替代方案
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档