python 多进程+多线程,多进程+协程 代码示例

此方法 可以在 flask+gunicorn 设置的服务中使用,注意 开发时,使用命令行方式启动服务,不要使用Pycharm(会崩溃);

 

  • 多进程+多线程
import time
from concurrent.futures import ThreadPoolExecutor, as_completed
from multiprocessing import Pool


class ProcessThread:
    def post(self):
        """
        多进程和线程配合使用示例
        """

        # 多进程 执行 fun_thread
        pool = Pool(5)
        lst = [1, 2, 3]
        res = pool.map(self.fun_thread, lst)
        pool.close()
        pool.join()
        print(res, "多进程 返回 的 所有线程及 每个线程执行函数的结果")

        print("执行其他任务")

    def fun_thread(self, num):
        """
        多线程执行 函数
        as_completed 有一个线程返回结果就返回一个结果,不用等到所有线程都返回
        :param num:
        :return:
        """
        result_list = []
        pool = ThreadPoolExecutor()
        pool_result = [pool.submit(self.intensive, n, id) for n, id in [(1, "a",), (3, "b",), (2, "c",), (2, "d",)]]
        for result in as_completed(pool_result):
            # 注意 调用 result.result()
            item = result.result()
            result_list.append(item)
            if len(result_list) == 2:
                break
        print(f"线程 {num} 执行的结果为:{result_list}")
        return result_list

    def intensive(self, n, id):
        """
        实际调用的方法
        :param n:
        :param id:
        :return:
        """
        time.sleep(n)
        print("每个函数执行的结果", n, id)
        return "task", n


if __name__ == "__main__":
    ProcessThread().post()

 

  • 多进程+协程
#!/usr/bin/env python3
# coding: utf-8
"""
多进程和协程配合使用示例
"""
from multiprocessing import Process

import gevent
from gevent import monkey
from gevent.pool import Group

monkey.patch_all()


class TestProgram(object):  # 测试程序

    def intensive(self, n):
        """
        协程函数
        :param n:
        :return:
        """
        gevent.sleep(n)
        print(f'协程函数执行完成,耗时{n}')
        return "task", n

    def fun_one(self):
        igroup = Group()
        result_list = []
        for i in igroup.imap_unordered(self.intensive, [3, 2, 1]):
            result_list.append(i)
            if len(result_list) == 2:
                break
        print(f"第1个进程函数 执行完成{result_list}")
        return "111"

    def fun_two(self):
        igroup = Group()
        result_list = []
        for i in igroup.imap_unordered(self.intensive, [4, 1.4, 1.1]):
            result_list.append(i)
            if len(result_list) == 2:
                break
        print(f"第2个进程函数 执行完成{result_list}")
        return "222"

    def fun_three(self):
        igroup = Group()
        result_list = []
        for i in igroup.imap_unordered(self.intensive, [3.2, 2.3, 1.6]):
            result_list.append(i)
            if len(result_list) == 2:
                break
        print(f"第3个进程函数 执行完成{result_list}")
        return "333"

    def main(self):
        """
        使用多进程执行程序
        :return:
        """
        p_lst = []
        p1 = Process(target=self.fun_one, args=(2,))
        p_lst.append(p1)
        p1.start()

        p2 = Process(target=self.fun_two, args=(3,))
        p_lst.append(p2)
        p2.start()

        p3 = Process(target=self.fun_three, args=(4,))
        p_lst.append(p3)
        p3.start()

        for p in p_lst:
            p.join()
            print('进程执行结束', p)
        print("开始其他任务")


TestProgram().main()  # 启动主程序,它会开启3个进程。

协程 中的 gevent 在协程间自动进行切换,注意使用时 开头添加 monkey.patch_all()  才能自动进行切换,比如  time.sleep(3) 和 gevent.time.sleep(3) ; 如果 没有添加 monkey.patch_all()则 time.sleep(3)没有效果,无法自动切换协程;

 

相关链接:

python 协程库gevent学习--gevent数据结构及实战

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章