2017-07-23 2 views
0

Derzeit versuche ich einen Pool innerhalb eines Threads zu starten, innerhalb dieses Pools werde ich Instanzen von Qt QWebEnginePage erstellen.PyQt wierd Verhalten mit Multiprocessing.pool

Es passieren zwei Dinge, die nicht passieren sollten.

Erstens:

die Art und Weise es durch die Liste iterieren nicht korrekt ist (entweder es einige Einträge übersprungen oder es ist nicht sortiert (nicht sicher, wie es nicht sein) würde)

Zweitens:

Die Schleife hängt, was bedeutet, dass alles aufhört und ich nichts dagegen tun kann.

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() 

Ausgang:

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 

Erwartete Ausgabe:

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 

Edit: Die for-Schleife funktioniert es ist nur der Pool, der

Antwort

0

gebrochen hat ich keine wirkliche herausfinden konnte, Lösungen, also habe ich einen Hack dafür gemacht, es ist nicht schön, aber es macht den Job fast so gut wie ein normaler Pool. Es erzeugt einen zusätzlichen Prozess für jeden Prozess, was bedeutet, dass zusätzlicher Speicher verwendet wird, aber ansonsten sollte es in Ordnung sein.

Wenn jemand eine bessere Lösung hat, bitte sie schreiben :)

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) 
Verwandte Themen