【问题标题】:PyQt wierd behavior with Multiprocessing.poolPyQt 奇怪的行为与 Multiprocessing.pool
【发布时间】:2017-07-23 01:40:05
【问题描述】:

目前我正在尝试在线程中启动一个池,在这个池中我将创建 Qt 的 QWebEnginePage 的实例。

有两件本不应该发生的事情正在发生。

第一:

它遍历列表的方式不准确(它跳过了一些条目或者它没有排序(不确定它会不会是这样))

第二:

循环挂起,这意味着一切都停止了,我似乎无能为力。

from multiprocessing.pool import Pool
from multiprocessing import Process

from threading import Thread
from PyQt5.Qt import *


class Webkit(QWebEnginePage):
    def __init__(self):
        self.app = QApplication([])

        super(Webkit, self).__init__()
        self.loadFinished.connect(self.pageFinishedLoading)

    def loadUrl(self, url):
        self.load(QUrl(url))
        self.app.exec()

    def pageFinishedLoading(self):
        self.app.quit()

def first():
    """Thread + Process"""
    #Thread(target=lambda: Process(target=second().foo()).start(), daemon=False).start()

    """Thread"""
    Thread(target=second().foo()).start()

    """Process"""
    #Process(target=second().foo()).start()


class second:
    def foo(self):
        count = 10

        print("Starting pool")
        with Pool(1) as pool:
            pool.map(final, range(count))

        print("Starting process")
        for x in range(count):
            p = Process(target=final, args=(x, ))
            p.start()
            p.join()

        print("Finished")

def final(a):
    print("Now creating webkit", a)
    wk = Webkit()
    wk.loadUrl("https://google.com")

if __name__ == '__main__':
    app = QApplication([])

    first()

    app.exec()

输出:

Starting pool
Now creating webkit 0
Now creating webkit 1
Now creating webkit 3
Now creating webkit 4
Now creating webkit 6
Now creating webkit 7
Now creating webkit 9

预期输出:

Starting pool
Now creating webkit 0
Now creating webkit 1
Now creating webkit 2
Now creating webkit 3
Now creating webkit 4
Now creating webkit 5
Now creating webkit 6
Now creating webkit 7
Now creating webkit 8
Now creating webkit 9

Starting process
Now creating webkit 0
Now creating webkit 1
Now creating webkit 2
Now creating webkit 3
Now creating webkit 4
Now creating webkit 5
Now creating webkit 6
Now creating webkit 7
Now creating webkit 8
Now creating webkit 9

Finished

编辑:for 循环有效,只是池损坏了

【问题讨论】:

    标签: python qt pyqt python-multiprocessing


    【解决方案1】:

    我想不出任何真正的解决方案,所以我为它做了一个 hack,它不是很漂亮,但它的工作几乎和普通游泳池一样好。它为每个进程创建一个额外的进程,这意味着它将使用额外的内存,但除此之外它应该没问题。

    如果有人有更好的解决方案,请发表:)

    import multiprocessing as mp
    from multiprocessing.pool import Pool, starmapstar
    import itertools
    
    def caller(func, *args):
        try: length = len(*args)
        except TypeError: length = 1
        p = mp.Process(target=func, args=tuple(*args) if length > 1 else (*args, ))
        p.start()
        return p.join()  # This will only return None
    
    
    
    class NoDaemonProcess(mp.Process):
        # make 'daemon' attribute always return False
        def _get_daemon(self):
            return False
        def _set_daemon(self, value):
            pass
        daemon = property(_get_daemon, _set_daemon)
    
    
    class MyPool(Pool):
        Process = NoDaemonProcess
    
        def _map_async(self, func, iterable, mapper, chunksize=None, callback=None, error_callback=None):
            iterable = zip(itertools.repeat(func), iterable)
            mapper = starmapstar
            func = caller
            return super(MyPool, self)._map_async(func, iterable, mapper, chunksize, callback, error_callback)
    

    【讨论】:

      猜你喜欢
      • 2012-01-19
      • 2021-10-30
      • 2022-01-20
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-24
      相关资源
      最近更新 更多