Pyqt5并发文件操作与并发。未来模块

时间:2018-07-31 05:48:17

标签: concurrency pyqt

我目前正在基于Pyqt5的一个python Gui开发上运行。与文件系统有关的操作很多,例如复制,移动和删除。我试图通过利用current.futures模块来提高这些操作的性能,并在Threadpoolexecutor和Processpoolexecutor上进行了实验。但是,它们都不给我一个解除阻止的gui,在我将文件操作提交到池之后,它就可以继续进行用户交互。这些提交的操作只是本机python类的静态方法。我还通过提交返回的Future对象添加了回调,这些回调是一个qt类的实例方法,并且在完成相应的提交作业后确实被调用。 只是无法找到解决冻结的ui问题的方法(即使只是持续几秒钟),有人可以帮忙吗?

from concurrent.futures import ProcessPoolExecutor

class ArchiveResManager:
    def __init__(self, resource_dir):
        self._path_reference_dir = resource_dir

def get_resource_list(self):
    return tuple(
        de.path for de in os.scandir(self._path_reference_dir) if de.is_file()
        )

def add_callback_resource_added(fn):
    self._callback_on_resource_added = fn

def add_resources(self, resources: iter):
    src_paths = tuple(p for p in resources)
    dest_paths = tuple(self._get_dest_path(p) for p in resources)
    with ProcessPoolExecutor(2) as executor:
        exe.submit(
            ArchiveResManager._do_resource_operations,
            src_paths,
            dest_paths
        ).add_done_callback(self._on_resource_added)

@staticmethod
def _do_resource_operations(src_paths, dest_paths):
    added_items = list()
    for src_path, dest_path in zip(src_paths, dest_paths):
        shutil.copyfile(
            src_path, dest_path
        )
        added_items.append(dest_path)
    return added_items

def _on_resource_added(self, future):
    if future.done():
        if self._callback_on_resource_added:
            self._callback_on_resource_added(future.result())

# This model class is bound to a instance of QListView in the QDialog of my project
class ArchiveModel(QAbstractListModel):

def __init__(self, archive_dir, parent):
    super().__init__(parent)
    self._archive_manager = ArchiveResManager(archive_dir)
    self._archive_manager.add_callback_resource_added(self._on_archive_operations_completed)
    self._archive_items = self._archive_manager.get_resource_list()

def _on_archive_operations_completed(self, result_list):
    last_row = self.rowCount() - 1
    self.beginInsertRows(QModelIndex(), last_row, last_row + len(result_list))
    self._archive_items.extend(result_list)
    self.endInsetRows()

0 个答案:

没有答案