Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 逆戟鲸程序;t使用Plotlys时关闭“;写“u image()”;用于存储来自子流程的静态图像的功能_Python_Multiprocessing_Plotly_Orca - Fatal编程技术网

Python 逆戟鲸程序;t使用Plotlys时关闭“;写“u image()”;用于存储来自子流程的静态图像的功能

Python 逆戟鲸程序;t使用Plotlys时关闭“;写“u image()”;用于存储来自子流程的静态图像的功能,python,multiprocessing,plotly,orca,Python,Multiprocessing,Plotly,Orca,在我的程序中,我将一个数据帧传递给工作者的多处理.Pool。然后,每个工人创建一个绘图图形,并通过fig.write\u image(“img\u name”)将其存储在磁盘上 如果我使用orca引擎fig.write_image(name,engine=“orca”)来存储图像,则orca引擎创建的子部分永远不会关闭,一段时间后,我开始出现与此相同的错误 我已经发现,通过使用kaleido引擎,这个问题不存在。下面是重现问题的代码。要查看在主python进程完成后还有多少进程仍在运行,请在te

在我的程序中,我将一个数据帧传递给工作者的
多处理.Pool
。然后,每个工人创建一个绘图图形,并通过
fig.write\u image(“img\u name”)
将其存储在磁盘上

如果我使用orca引擎
fig.write_image(name,engine=“orca”)
来存储图像,则orca引擎创建的子部分永远不会关闭,一段时间后,我开始出现与此相同的错误

我已经发现,通过使用
kaleido
引擎,这个问题不存在。下面是重现问题的代码。要查看在主python进程完成后还有多少进程仍在运行,请在terminal中打开
htop
,然后按F4并键入orca以过滤这些进程

是否有人知道这是orca的一个已知问题,或者我在我的多处理代码中做错了什么

要运行代码,您需要在当前工作路径中创建目录
test\u images\u 2/

Orca版本:
plotly Orca 1.3.1

# General imports
import multiprocessing
import os
import time
import psutil
import pandas as pd
import random
import plotly.express as px
import plotly
import queue
# Project specific imports

# Imports from internal libraries

# Typing imports
from typing import TYPE_CHECKING


# if TYPE_CHECKING:

def rand_data_gen(size):
    df = pd.DataFrame(
        dict([(x, [random.random() for _ in range(size)]) for x in range(size)])
    )
    return df


def work_2(qe):
    item = qe.get(True)
    qdf = item[0]
    name = item[1]
    print(os.getpid(), "got", name)
    fig = px.imshow(qdf)
    fig.write_image(name)
    return True


def worker_main(qe):
    print(os.getpid(), "working")
    while True:
        item = qe.get(True)
        qdf = item[0]
        name = item[1]
        print(os.getpid(), "got", name)

        fig = px.imshow(qdf)
        fig.write_image(name,engine="orca")


if __name__ == '__main__':
    print(f'Running {__file__}')
    print(f"Script dir:  {os.path.dirname(os.path.abspath(__file__))}")
    print(f"Working dir: {os.path.abspath(os.getcwd())}")
    print(f"System memory: {psutil.virtual_memory()}")

    save_path = "test_images_2/"

    end_evt = multiprocessing.Event()
    the_queue = multiprocessing.Queue()

    the_pool = multiprocessing.Pool(5, worker_main, (the_queue,))
    # the_pool = multiprocessing.Pool(5, work_2, (the_queue,))
    i = 0
    for i in range(100):
        df = rand_data_gen(100)
        i += 1
        the_queue.put((df, f"{save_path}image{i}.png"))
        print(the_queue.qsize())

    count_sleep = 0

    while not the_queue.empty():
        count_sleep += 1
        print(f"\rWaiting for que to be empty: {count_sleep}", end="")
        time.sleep(1)

    end_evt.set()