Opencv Flask:如何成功地使用多处理(而不是多线程)?

Opencv Flask:如何成功地使用多处理(而不是多线程)?,opencv,flask,multiprocessing,python-multiprocessing,concurrent.futures,Opencv,Flask,Multiprocessing,Python Multiprocessing,Concurrent.futures,我使用Flask服务器来处理一些图像处理任务的请求 处理过程广泛依赖于OpenCV,现在我想简单地并行化一些较慢的步骤 我更喜欢多处理而不是多线程(请在回答中假设前者) 但opencv的多处理功能显然已被破坏(我使用的是Python 2.7+macOS): 一个解决方案(参见)是使用优秀的Loky() [问题:除了concurrent.futures,loky,joblib,还有什么其他工作解决方案?] 但洛基让我找到了以下线索: a,b = f.result() File "/an

我使用Flask服务器来处理一些图像处理任务的请求

处理过程广泛依赖于OpenCV,现在我想简单地并行化一些较慢的步骤

我更喜欢多处理而不是多线程(请在回答中假设前者)

但opencv的多处理功能显然已被破坏(我使用的是Python 2.7+macOS):

一个解决方案(参见)是使用优秀的Loky()

[问题:除了
concurrent.futures
loky
joblib
,还有什么其他工作解决方案?]

但洛基让我找到了以下线索:

    a,b = f.result()
  File "/anaconda2/lib/python2.7/site-packages/loky/_base.py", line 433, in result
    return self.__get_result()
  File "/anaconda2/lib/python2.7/site-packages/loky/_base.py", line 381, in __get_result
    raise self._exception
BrokenProcessPool: A task has failed to un-serialize. Please ensure that the arguments of the function are all picklable.

This was caused directly by
'''
Traceback (most recent call last):
  File "/anaconda2/lib/python2.7/site-packages/loky/process_executor.py", line 391, in _process_worker
    call_item = call_queue.get(block=True, timeout=timeout)
  File "/anaconda2/lib/python2.7/multiprocessing/queues.py", line 135, in get
    res = self._recv()
  File "myfile.py", line 44, in <module>
    app.config['EXECUTOR_MAX_WORKERS'] = 5
  File "/anaconda2/lib/python2.7/site-packages/werkzeug/local.py", line 348, in __getattr__
    return getattr(self._get_current_object(), name)
  File "/anaconda2/lib/python2.7/site-packages/werkzeug/local.py", line 307, in _get_current_object
    return self.__local()
  File "/anaconda2/lib/python2.7/site-packages/flask/globals.py", line 52, in _find_app
    raise RuntimeError(_app_ctx_err_msg)
RuntimeError: Working outside of application context.

This typically means that you attempted to use functionality that needed
to interface with the current application object in some way. To solve
this, set up an application context with app.app_context().  See the
documentation for more information.
'''
a,b=f.result()
文件“/anaconda2/lib/python2.7/site packages/loky/_base.py”,第433行,在结果中
返回self.\u获取\u结果()
文件“/anaconda2/lib/python2.7/site packages/loky/_base.py”,第381行,在获取结果中
提出自己的意见
BrokenProcessPool:任务取消序列化失败。请确保函数的参数都是可拾取的。
这是直接原因
'''
回溯(最近一次呼叫最后一次):
文件“/anaconda2/lib/python2.7/site packages/loky/process\u executor.py”,第391行,in\u process\u worker
call\u item=call\u queue.get(block=True,timeout=timeout)
get中的文件“/anaconda2/lib/python2.7/multiprocessing/queues.py”,第135行
res=自我。_recv()
文件“myfile.py”,第44行,在
app.config['EXECUTOR\u MAX\u WORKERS']=5
文件“/anaconda2/lib/python2.7/site packages/werkzeug/local.py”,第348行,在__
返回getattr(self.\u get\u current\u object(),name)
文件“/anaconda2/lib/python2.7/site packages/werkzeug/local.py”,第307行,在当前对象中
返回self.\uuu local()
文件“/anaconda2/lib/python2.7/site packages/flask/globals.py”,第52行,在“查找”应用程序中
raise RUNTIMERROR(\u app\u ctx\u err\u msg)
运行时错误:在应用程序上下文之外工作。
这通常意味着您试图使用所需的功能
以某种方式与当前应用程序对象接口。解决
为此,请使用app.app_context()设置应用程序上下文。见
有关更多信息,请参阅文档。
'''
要并行化的函数不是从
app/main.py
调用的,而是从一个特定的深层子模块调用的

我尝试过同样有用的外观,但到目前为止也是徒劳的

所以问题是:

如何安全地将应用程序上下文传递给工作程序,或以其他方式进行多处理(无需求助于多线程)?

如果你需要更多的信息,我可以提出这个问题。一如既往地非常感谢

相关资源:

更新:

非opencv调用与flask executor(无Loky)配合良好:)

当试图调用像
knnMatch
这样的opencv函数时,就会出现问题

如果Loky修复了opencv问题,我想知道是否可以让它与flask executor一起工作(到目前为止,还不适合我)