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