调用b中的子进程和共享自对象

2024-09-28 15:24:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个典型的多生产者和一个消费者使用python子流程和一个队列。 使用者具有对另一个对象的回调。尽管对象与所有子流程共享,但子流程完成后,对对象的更改将丢失。你知道吗

代码如下:

from multiprocessing import Process, Queue
import random
import time

class Manager(object):
    def __init__(self):
        self.queue = Queue()

    def consume(self, call_back):
        while True:
            task = self.queue.get()
            if task is None:
                self.queue.close()
                break
            time.sleep(0.05)
            call_back(task)
            print("Queue got task: {}.".format(task))

    def produce(self, value):
        time.sleep(random.uniform(0.1, 1.0))
        task = "TSK {}".format(value)
        self.queue.put(task)


    def start(self, call_back, n_tasks=10):

        consumer = Process(target=self.consume, args=(call_back,))
        consumer.start()

        workers = [Process(target=self.produce,args=(i,))
            for i in range(n_tasks)]

        for w in workers:
            w.start()
        for w in workers:
            w.join()

        self.queue.put(None)
        consumer.join()


class Display(object):
    def __init__(self):
        self.tasks = []

    def display_tasks(self, n_tasks=10):
        def add_task(task):
            self.tasks.append(task)
            print("Dislaying tasks so far: {}".format(self.tasks))
        Manager().start(add_task, n_tasks)
        print("Total tasks: {}".format(self.tasks))


Display().display_tasks(5)

输出为:

Dislaying tasks so far: ['TSK 3']
Queue got task: TSK 3.
Dislaying tasks so far: ['TSK 3', 'TSK 4']
Queue got task: TSK 4.
Dislaying tasks so far: ['TSK 3', 'TSK 4', 'TSK 2']
Queue got task: TSK 2.
Dislaying tasks so far: ['TSK 3', 'TSK 4', 'TSK 2', 'TSK 0']
Queue got task: TSK 0.
Dislaying tasks so far: ['TSK 3', 'TSK 4', 'TSK 2', 'TSK 0', 'TSK 1']
Queue got task: TSK 1.
Total tasks: []

我期待着:

Total tasks: ['TSK 3', 'TSK 4', 'TSK 2', 'TSK 0', 'TSK 1']

你知道如何做到这一点吗

class Display(object):
    def __init__(self):
        manager = Manager()
        self.tasks = manager.list()

实际上,在实际情况中,这是使用QTableWidget,表中的每个条目都是QTableWidgetItem。。。。你知道吗

这里是真正的回调函数(data_set_table是一个QTableWidget):

def _add_item(data):
        row = dc.size()
        self._content.data_set_table.insertRow(row)
        for i in range(len(data)):
            if data[i] is not None:
                item = QtGui.QTableWidgetItem(str(data[i]))
                item.setFlags( QtCore.Qt.ItemIsSelectable |  QtCore.Qt.ItemIsEnabled )
                self._content.data_set_table.setItem(row, i, item)

Tags: selfformattaskdatasoqueuedefback
1条回答
网友
1楼 · 发布于 2024-09-28 15:24:56

答案似乎是使用Manager。我将删除它不起作用的答案PyQt

从多处理导入进程、队列、管理器 从多处理管理器导入BaseManager
随机导入 导入时间

class Scheduler(object):
    def __init__(self):
        self.queue = Queue()

    def consume(self, call_back):
        while True:
            task = self.queue.get()
            if task is None:
                self.queue.close()
                break
            time.sleep(0.05)
            print("Queue got task: {}.".format(task))
            call_back(task)

    def produce(self, value):
        time.sleep(random.uniform(0.1, 1.0))
        task = "TSK {}".format(value)
        self.queue.put(task)


    def start(self, call_back, n_tasks=10):

        consumer = Process(target=self.consume, args=(call_back,))
        consumer.start()

        workers = [Process(target=self.produce,args=(i,))
            for i in range(n_tasks)]

        for w in workers:
            w.start()
        for w in workers:
            w.join()

        self.queue.put(None)
        consumer.join()

class CustomTable(object):
    def __init__(self):
        self.contents = []

    def addItem(self, item):
        self.contents.append(item)

    def display(self):
        print(self.__repr__)

    def __repr__(self):
        res = 80*"-" + "\n" + str(self.contents) + "\n" + 80*"-" + "\n"
        return res

class CustomTableManager(BaseManager):  
    pass  

CustomTableManager.register('CustomTable', CustomTable, exposed = ['contents', 'addItem', 'display', '__repr__'])  

customTableManager = CustomTableManager()  
customTableManager.start()  

class Display(object):
    def __init__(self):
        # self.tasks = CustomTable()
        self.tasks = customTableManager.CustomTable()

    def display_tasks(self, n_tasks=10):
        def add_task(task):
            self.tasks.addItem(task)
            print("Dislaying tasks so far:\n{}".format(self.tasks))
        Scheduler().start(add_task, n_tasks)
        print("Total tasks:\n{}".format(self.tasks))

Display().display_tasks(5)

相关问题 更多 >