Path: blob/master/sage/parallel/multiprocessing_sage.py
4056 views
"""1Parallel Iterator built using Python's multiprocessing module2"""34################################################################################5# Copyright (C) 2008 William Stein <[email protected]>6#7# Distributed under the terms of (any version of) the GNU8# General Public License (GPL). The full text of the GPL is available at:9#10# http://www.gnu.org/licenses/11################################################################################1213from multiprocessing import Pool14from functools import partial15from sage.misc.fpickle import pickle_function, call_pickled_function16import ncpus1718def pyprocessing(processes=0):19"""20Return a parallel iterator using a given number of processes21implemented using pyprocessing.2223INPUTS:2425- ``processes`` -- integer (default: 0); if 0, set to the number26of processors on the computer.2728OUTPUT:2930- a (partially evaluated) function3132EXAMPLES::3334sage: from sage.parallel.multiprocessing_sage import pyprocessing35sage: p_iter = pyprocessing(4)36sage: P = parallel(p_iter=p_iter)37sage: def f(x): return x+x38sage: v = list(P(f)(range(10))); v.sort(); v39[(((0,), {}), 0), (((1,), {}), 2), (((2,), {}), 4), (((3,), {}), 6), (((4,), {}), 8), (((5,), {}), 10), (((6,), {}), 12), (((7,), {}), 14), (((8,), {}), 16), (((9,), {}), 18)]40"""41if processes == 0: processes = ncpus.ncpus()42return partial(parallel_iter, processes)4344def parallel_iter(processes, f, inputs):45"""46Return a parallel iterator.4748INPUT:4950- ``processes`` -- integer51- ``f`` -- function52- ``inputs`` -- an iterable of pairs (args, kwds)5354OUTPUT:5556- iterator over values of ``f`` at ``args,kwds`` in some random order.5758EXAMPLES::5960sage: def f(x): return x+x61sage: import sage.parallel.multiprocessing_sage62sage: v = list(sage.parallel.multiprocessing_sage.parallel_iter(2, f, [((2,), {}), ((3,),{})]))63sage: v.sort(); v64[(((2,), {}), 4), (((3,), {}), 6)]65"""66from twisted.internet import reactor # do not delete this (!) -- see trac 87856768if processes == 0: processes = ncpus.ncpus()69p = Pool(processes)70fp = pickle_function(f)7172result = p.imap_unordered(call_pickled_function, [ (fp, t) for t in inputs ])73for res in result:74yield res75767778