Как создать много фигурок Боке с помощью многопроцессорной обработки? - PullRequest
0 голосов
/ 02 ноября 2019

Я бы хотел ускорить генерацию фигур в Bokeh с помощью многопроцессорной обработки:

jobs = []
for label in list(peakLabels):  
    args = {'data': rt_proj_data[label],
                    'label': label,
                    'tools': tools,
                    'colors': itertools.cycle(palette),
                    'files': files,
                    'highlight': highlight}
    jobs.append(args)

pool = Pool(processes=cpu_count())
m = Manager()
q = m.Queue()
plots = pool.map_async(plot_peaks_parallel, jobs)
pool.close()
pool.join()      

def plot_peaks_parallel(args):
    data = args['data']
    label = args['label']
    colors = args['colors']
    tools = args['tools']
    files = args['files']
    highlight = args['highlight']

    p = figure(title=f'Peak: {label}', 
               x_axis_label='Retention Time', 
               y_axis_label='Intensity',
               tools=tools)
    ...
    return p

Хотя я столкнулся с этой ошибкой:

MaybeEncodingError: Ошибка при отправке результата: '[Figure(id = '1078', ...)] '. Причина: 'PicklingError ("Не удается засечь в 0x7fc7df0c0ea0>: поиск атрибута ColumnDataSource. On bokeh.models.sources не удалось")'

Могу ли я что-то сделать с объектом p, чтобыстановится маринованным?

1 Ответ

0 голосов
/ 02 ноября 2019

Отдельные объекты Bokeh не могут быть сериализованы отдельно, в том числе с pickle. Наименьшая значимая единица сериализации в Bokeh - Document, которая является определенной коллекцией объектов Bokeh, которые, как гарантируют, будут полны относительно следующих ссылок. Тем не менее, я был бы удивлен, если pickle работает с Document (AFAIK, вы первый, кто спрашивает об этом с момента начала проекта, он никогда не был приоритетом или даже не изучал то, о чем я знаю). Вместо этого я бы предложил, если вы хотите сделать что-то подобное, использовать собственные функции сериализации JSON Bokeh, такие как json_item:

# python code
p_serialized = json.dumps(json_item(p))

Это будет правильно сериализовать pв контексте Document он является частью. Затем вы можете передать это своим шаблонам страниц для отображения с помощью API-вставки Bokeh JS:

# javascript code
p = JSON.parse(p_serialized);
Bokeh.embed.embed_item(p, "mydiv")
...