<div dir="ltr">Dear Eric Folks,<div>I have recently upgraded from:</div><div>- Python 3.9.5, 64-bit</div><div>- Qt 5.15.2</div><div>- PyQt 5.15.4</div><div>- QScintilla 2.12.0</div><div>- sip 6.1.0.dev2104271705</div><div>- eric6 19.12(rev.274baadc5686)</div><div><br></div><div>to:</div><div>- Python 3.9.13, 64-bit</div><div>- Qt 6.6.0</div><div>- PyQt 6.6.0</div><div>- QScintilla 2.14.1</div><div>- sip 6.7.12</div><div>- eric7 23.112(rev.e075c8fe07fd)</div><div><br></div><div>After porting to PyQt6 (mostly enum fixes) most of my applications are running just fine. However,</div><div>I have noticed big issues with parallel processing apps. I've whittled down a Solitaire simulation</div><div>to a bare minimum to show the problem. The runs in about 1 sec (almost all parallel queue setup)</div><div>on Eric6 / PyQt5, but never terminates or prints anything on Eric7 / PyQt6. Also, when I set the</div><div>cpu count to number of cores (right now the code hardwires cpus = 1) and the iterations to 30,000</div><div>the Eric6 process takes 105 seconds and pegs all 32 cores to 100% almost immediately. On the other hand, the Eric7 process never show a utilization of more than 7 or 8%. </div><div><br></div><div>Any help would be greatly appreciated, along with any suggestions of what I could try next.</div><div><br></div><div>Here is the code if it helps:</div><div><br></div><div>--------------------------------------------------------------------------------------------------------</div><div>import random<br>import itertools<br>import multiprocessing<br>import numpy as np<br>from time import time<br><br><br>#=====================================================================<br>#<br># Parallel Solitaire Simulator<br>#<br><br>def parallelSim(jobs, sims):<br>    print(f'Sim # {sims}')<br>    for new_deck, iterations, in iter(jobs.get, 'STOP'):<br>        results = np.zeros(52, 'i')<br>        for sim in range(iterations):<br>            deck = new_deck.copy()<br>            random.shuffle(deck)<br>            piles = []<br>            while len(deck):<br>                piles.append([deck.pop()])<br><br>            # start playing<br>            i = len(piles) - 1<br>            while i > 0:<br>                # check next pile Suit and Number<br>                if (piles[i-1][-1][0] == piles[i][-1][0] or<br>                    piles[i-1][-1][1] == piles[i][-1][1]):<br><br>                        # adjacent pile has a match, card goes there<br>                        piles[i-1].extend(piles[i])<br><br>                        # left shift all the remaining used piles<br>                        piles[i:] = piles[i+1:]<br><br>                        # adjust index to shifted pile<br>                        i = len(piles) - 1<br>                        continue<br>                i -= 1<br><br>            results[len(piles)] += 1<br><br>        sims.put(results)<br>#<br>#====================================================================<br><br><br>if __name__ == '__main__':<br>    killZombies()<br><br>    start_time = time()<br><br>    # randomize the randomizer<br>    random.seed()<br><br>    numCPUs = multiprocessing.cpu_count()<br>    numCPUs = 1<br>    jobs = multiprocessing.Queue()<br>    sims = multiprocessing.Queue()<br><br>    # create a deck of cards<br>    new_deck = list(itertools.product('HCDS', range(1, 14)))<br><br>    iterations = 10<br>    numJobs = numCPUs * iterations<br>    for sim in range(numCPUs):<br>        jobs.put([new_deck.copy(), iterations])<br><br>    # add Stops to the queues<br>    for x in range(numCPUs):<br>        jobs.put('STOP')<br><br>    serialDebug = False<br>    if serialDebug is True:<br>        parallelSim(jobs, sims)<br><br>    else:<br>        # parallelize file processing using a pool of processes<br>        for i in range(numCPUs):<br>            multiprocessing.Process(target=parallelSim, args=(jobs, sims)).start()<br><br>    results = np.zeros(52, 'i')<br>    for r in range(numCPUs):<br>        partial = sims.get()<br>        results += partial<br><br>    print("")<br>    result_indicies = np.nonzero(results)[0]<br>    total = 0<br>    for index in result_indicies:<br>        print('{:d}:{:d},  '.format(index, results[index]), end="")<br>        total += results[index]<br><br>    print("")<br>    print("Wins = ", results[1])<br>    print("Total = ", total)<br>    print("Win Ratio = ", results[1]/total)<br>    print("")<br><br>    end_time = time()<br>    elapsed = end_time - start_time<br>    print(f"Finished in: {elapsed:.3f} seconds")<br>    print("Done")<br></div><div><br></div><div><br></div></div>