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()