此方法 可以在 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)没有效果,无法自动切换协程;
相关链接: