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