72006fe05b
- allows starting new processes and controlling them remotely from the parent process - remote processes can run their own GUI, Qt signals can be connected between processes (in general this is not possible with the built-in multiprocessing module due to the use of fork() ). - Control works by a system of proxy-objects such that controlling a remote process looks almost exactly like working with local objects. - Uses sockets to communicate between processes (so in theory could be made to work over a network), but also includes a mode that uses fork() to allow fast parallelization. - Wicked-easy inline parallelization by adding only one line of code to break up work between processes (requires fork; sorry windows users)
85 lines
2.1 KiB
Python
85 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
import initExample ## Add path to library (just for examples; you do not need this)
|
|
|
|
import numpy as np
|
|
import pyqtgraph.multiprocess as mp
|
|
from pyqtgraph.multiprocess.parallelizer import Parallelize #, Parallelizer
|
|
import time
|
|
|
|
print "\n=================\nParallelize"
|
|
tasks = [1,2,4,8]
|
|
results = [None] * len(tasks)
|
|
size = 2000000
|
|
|
|
start = time.time()
|
|
with Parallelize(enumerate(tasks), results=results, workers=1) as tasker:
|
|
for i, x in tasker:
|
|
print i, x
|
|
tot = 0
|
|
for j in xrange(size):
|
|
tot += j * x
|
|
results[i] = tot
|
|
print results
|
|
print "serial:", time.time() - start
|
|
|
|
start = time.time()
|
|
with Parallelize(enumerate(tasks), results=results) as tasker:
|
|
for i, x in tasker:
|
|
print i, x
|
|
tot = 0
|
|
for j in xrange(size):
|
|
tot += j * x
|
|
results[i] = tot
|
|
print results
|
|
print "parallel:", time.time() - start
|
|
|
|
|
|
|
|
|
|
print "\n=================\nStart Process"
|
|
proc = mp.Process()
|
|
import os
|
|
print "parent:", os.getpid(), "child:", proc.proc.pid
|
|
print "started"
|
|
rnp = proc._import('numpy')
|
|
arr = rnp.array([1,2,3,4])
|
|
print repr(arr)
|
|
print str(arr)
|
|
print "return value:", repr(arr.mean(_returnType='value'))
|
|
print "return proxy:", repr(arr.mean(_returnType='proxy'))
|
|
print "return auto: ", repr(arr.mean(_returnType='auto'))
|
|
proc.join()
|
|
print "process finished"
|
|
|
|
|
|
|
|
print "\n=================\nStart ForkedProcess"
|
|
proc = mp.ForkedProcess()
|
|
rnp = proc._import('numpy')
|
|
arr = rnp.array([1,2,3,4])
|
|
print repr(arr)
|
|
print str(arr)
|
|
print repr(arr.mean())
|
|
proc.join()
|
|
print "process finished"
|
|
|
|
|
|
|
|
|
|
import pyqtgraph as pg
|
|
from pyqtgraph.Qt import QtCore, QtGui
|
|
app = pg.QtGui.QApplication([])
|
|
|
|
print "\n=================\nStart QtProcess"
|
|
proc = mp.QtProcess()
|
|
d1 = proc.transfer(np.random.normal(size=1000))
|
|
d2 = proc.transfer(np.random.normal(size=1000))
|
|
rpg = proc._import('pyqtgraph')
|
|
plt = rpg.plot(d1+d2)
|
|
|
|
|
|
## Start Qt event loop unless running in interactive mode or using pyside.
|
|
#import sys
|
|
#if (sys.flags.interactive != 1) or not hasattr(QtCore, 'PYQT_VERSION'):
|
|
#QtGui.QApplication.instance().exec_()
|