Как визуализировать потоки в многопоточном графике задач / времени? - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь построить потоки моего многопоточного кода осмысленно, используя matplotlib. Я хочу, чтобы каждая нить визуализировалась одним цветом. Таким образом, график четко покажет, какие задачи выполняются каким потоком и т. Д. Итак, чтобы было ясно, я хочу сказать (рисунок внизу), желтые столбцы - это процессы, выполняемые потоком 1, красные столбцы - процессы, выполняемые потоком 2 ипроцессы синих полос, выполняемые потоком 3.

Это кажется довольно сложным, и лучшее, что я мог придумать, - это внизу (см. рисунок и код). В этом примере у нас есть 3 потока и 12 задач (продолжительность каждой задачи варьируется до некоторой точки). Thread1 начинает желтым, thread2 начинается красным, а thread3 начинается синим. Я бы хотел, чтобы они были такими же цветными на протяжении всего графика. Однако мы видим, что поток 1 выполняет задачи 0, 7 и 10, но переключает цвет с желтого на красный на красный. То же самое для потока 2: он выполняет задачи 2, 5, 8 и 11, но переключает цвет с красного на синий с синего на синий. То же самое для потока 3. Таким образом, цвета появляются фактически в цикле 3 здесь и не зависят от потоков. Я хочу, чтобы они зависели от номера потока, как я уже говорил ранее, чтобы сделать многопоточный график намного более значимым (потому что это не так).

Кто-нибудь есть идеи, как это сделать?

threading plot

import threading
import multiprocessing
import math
import numpy as np
import time
import matplotlib.pyplot as plt
import glob
from PIL import Image
import random
from random import sample
import string
from concurrent.futures import ThreadPoolExecutor


cpu_workers = 3
nSim = 12

def generate_bar_colors(cpu_workers):
    colors = ['red', 'gold', 'royalblue']
    return colors

def visualize_runtimes(results, title):
    colors = generate_bar_colors(cpu_workers)
    plt.rcParams["font.family"] = "Times New Roman"
    plt.rcParams['axes.axisbelow'] = True
    start,stop = np.array(results).T
    plt.barh(range(len(start)),stop-start,left=start, color=colors)
    plt.grid(axis='x', color= 'lightgrey')
    plt.title("Tasks", rotation='horizontal', fontsize=12, horizontalalignment="left", x=0)
    plt.xlabel("Seconds", fontsize=12, horizontalalignment='right', x=1.0)

def multithreading(func, args, workers):
    begin_time=time.time()
    with ThreadPoolExecutor(max_workers = workers) as executor:
        res = executor.map(func, args, [begin_time for i in range (len(args))])
    return list(res)

def simulation(i, base):
    start = time.time() - base
    print(str(threading.current_thread().getName()) + ': '+ str(i))
    time.sleep(math.cos(i)+i*0.1+1)
    stop = time.time() - base
    return start, stop


if __name__ == '__main__':
    visualize_runtimes(multithreading(simulation, i, cpu_workers), "Multi-threading")
    plt.savefig('foo.png', bbox_inches='tight')

plt.show()
...