【发布时间】:2021-06-26 17:00:52
【问题描述】:
我正在使用 pygtgraph 和 pyqt5 用十字线画线,然后根据算法用十种不同的颜色对它们进行着色。我还使用滑块来选择要着色的第一行数。 每次滑块值更改时,GUI 都会冻结以计算我不希望发生的颜色。
我尝试将计算放在不同的线程中,它有点工作,但现在我想使用进程。 我正在尝试做的是使用多处理来创建一个线程池来处理队列中的算法调用和一个线程来重新着色绘制的线条。
self.threads = max(1, multiprocessing.cpu_count() - 3)
self.queue_in = multiprocessing.Queue()
self.queue_out = multiprocessing.Queue()
self.the_pool = multiprocessing.Pool(self.threads, algorithm_worker, (self.queue_in, self.queue_out))
self.recolor_thread = multiprocessing.Process(target=assign_and_recolor_worker, args=(
self.queue_out, self.color_numbers, self.canvas.getPlotItem(), self.pens))
self.recolor_thread.start()
这些是函数:
def algorithm_worker(queue_in, queue_out):
print(os.getpid(), "working")
while True:
lines = queue_in.get(block=True)
result = list(get_color_nums_algo(lines)) if lines else []
print(result)
queue_out.put(result)
def assign_and_recolor_worker(queue_in, color_nums, plot_item, pens):
print(os.getpid(), "working")
while True:
color_nums = queue_in.get(block=True)
for plotdataitem, pen_i in zip(plot_item.items, color_nums):
plotdataitem.setPen(pens[pen_i % len(pens)])
第一部分似乎运行良好,但由于我是多处理新手,所以我在第二部分中遇到了很多困难。
- 我不知道如何从
self.recolor_thread中更改主窗口内的变量,主要是:分配的颜色编号列表self.color_numbers。 - 我也不知道如何访问
self.canvas.getPlotItem().items
1 - 我尝试使用manager,但它没有更新值
self.manager = multiprocessing.Manager()
self.color_numbers = self.manager.list()
2 - 我通过了 PlotItem 和 mkPen 但得到类似的错误
TypeError: cannot pickle 'PlotItem' object
如何解决或规避这些问题?这是必要代码的链接https://pastebin.com/RyvNpP67
【问题讨论】:
标签: python multiprocessing pyqt5 python-multiprocessing pyqtgraph