我正在使用Doug Hellmann关于多处理的教程中的以下示例:
import multiprocessing
def worker():
"""worker function"""
print 'Worker'
return
if __name__ == '__main__':
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
当我试图在if语句之外运行它时:
import multiprocessing
def worker():
"""worker function"""
print 'Worker'
return
jobs = []
for i in range(5):
p = multiprocessing.Process(target=worker)
jobs.append(p)
p.start()
Run Code Online (Sandbox Code Playgroud)
它开始不间断地产生进程,并且阻止它的唯一方法是重启!
为什么会这样?为什么它没有生成5个进程并退出?为什么我需要if语句?
Ubuntu - 18.04
Python - 3.6.6
cx_Freeze - 6.1
简单的main_script.py文件(存储库中的示例 - https://github.com/Yuriy-Leonov/cython_multiprocessing_issue)
import multiprocessing
if __name__ == '__main__':
print("step-1")
multiprocessing.set_start_method("spawn")
print("step-2")
multiprocessing.freeze_support()
print("step-3")
manager = multiprocessing.Manager()
print("step-4")
s_dict = manager.dict()
print("finish")
Run Code Online (Sandbox Code Playgroud)
和setup.py(用于 cx_Freeze):
import cx_Freeze
executables = [cx_Freeze.Executable("main_script.py")]
cx_Freeze.setup(
name="Example",
options={
"build_exe": {
"replace_paths": [("*", "")]
},
},
executables=executables
)
Run Code Online (Sandbox Code Playgroud)
通过命令构建可执行文件后,python setup.py build我运行了它,控制台日志包含以下内容:
step-1
step-2
step-3
step-1
step-2
step-3
step-1
step-2
step-3
...
Run Code Online (Sandbox Code Playgroud)
并且产生无限的过程。
我知道multiprocessing.Manager()应该产生“服务器”进程。但无法获得当前行为的线索以及如何强制它创建“共享字典”
multiprocessing.set_start_method("spawn") 由于主程序行为,无法更改和要求。 …
我在 Docker 容器内的 Flask 应用程序中运行 joblib,以及由 supervisord 启动的 uWSGI(从启用线程开始)。
网络服务器的启动显示以下错误:
unable to load configuration from from multiprocessing.semaphore_tracker import main;main(15)
/usr/local/lib/python3.5/dist-packages/sklearn/externals/joblib/_multiprocessing_helpers.py:38: UserWarning:
[Errno 32] Broken pipe. joblib will operate in serial mode
Run Code Online (Sandbox Code Playgroud)
知道如何解决这个问题并使 joblib 并行运行吗?谢谢!
docker 容器中安装了以下包:
pytest==4.0.1
pytest-cov==2.6.0
flake8==3.6.0
Cython==0.29.3
numpy==1.16.1
pandas==0.24.0
scikit-learn==0.20.2
fancyimpute==0.4.2
scikit-garden==0.1.3
category_encoders==1.3.0
boto3==1.9.86
joblib==0.13.1
dash==0.37.0
dash-renderer==0.18.0
dash-core-components==0.43.1
dash-table==3.4.0
dash-html-components==0.13.5
dash-auth==1.3.2
Flask-Caching==1.4.0
plotly==3.6.1
APScheduler==3.5.3
Run Code Online (Sandbox Code Playgroud)
问题要么是由于 uWSGI、nginx 或 supervisord。缺少权限dev/shm不是问题,因为如果我直接运行 Flask 服务器,可以创建信号量。在下面找到三个服务的配置文件。免责声明,我是网络服务器新手,配置是通过从不同的博客复制和粘贴而产生的,只是为了使其工作:-D
所以这是我的 uwsgi 配置:
[uwsgi]
module = prism_dash_frontend.__main__
callable = server
uid = nginx
gid …Run Code Online (Sandbox Code Playgroud)