相关疑难解决方法(0)

多处理炸弹

我正在使用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语句?

python multiprocessing

36
推荐指数
2
解决办法
4917
查看次数

Ubuntu、cx_Freeze 和 multiprocessing.Manager() 冲突,以防“spawn”类型进程

环境:

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") 由于主程序行为,无法更改和要求。 …

python linux ubuntu multiprocessing cx-freeze

7
推荐指数
1
解决办法
193
查看次数

uWSGI 和 joblib 信号量:Joblib 将在串行模式下运行

我在 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)

python flask uwsgi docker joblib

4
推荐指数
1
解决办法
2278
查看次数

标签 统计

python ×3

multiprocessing ×2

cx-freeze ×1

docker ×1

flask ×1

joblib ×1

linux ×1

ubuntu ×1

uwsgi ×1