Многопроцессорный бесконечный цикл на окнах (Python) - PullRequest
2 голосов
/ 10 сентября 2011

Я пытаюсь сделать свою первую симуляцию, используя несколько процессов, сейчас каждая симуляция занимает около часа. Для этого я использую многопроцессорный импорт.

Весь код работает нормально, когда я запускаю симуляцию () внутри цикла for. Когда программа запускается, все работники в пуле начинают выполнять одну и ту же задачу, поэтому я получаю 4 копии одного и того же, но когда они закончили, они начинают снова и снова. Более того, при создании пула вся программа запускается из строки 1 одновременно четыре раза, вместо того, чтобы просто запускать симуляцию.

Приведенный ниже код почти полностью скопирован из примера в многопроцессорной документации: http://docs.python.org/library/multiprocessing.html

Я работаю на Windows 7, и я постараюсь запустить его на Linux-машине, как только смогу, но кто-нибудь может объяснить мне, что здесь происходит.

Большое спасибо

оплаченный Windows 7 (64bit) + Python 2.7.1

....

code where: simulation, pulse1, pulse2, sol_ref, model, algorithm and i are defined. Also 
where the various imports are made. Also some print statements.

...


if __name__=='__main__':
    freeze_support()

    def calculate(func, args):
        result = func(*args)
        return '%s says that %s%s = %s' % (
            multiprocessing.current_process().name,
            func.__name__, args, result
            )


    PROCESSES = 4
    print 'Creating pool with %d processes\n' % PROCESSES
    pool = Pool(PROCESSES)
    print 'pool = %s' % pool
    print

    TASKS = [(simulation, (pulse1,pulse2,sol_ref,model,algorithm,i)) for i in delta_tau]

    results = [pool.apply_async(calculate, t) for t in TASKS]
    for r in results:
        print '\t', r.get()
    print

РЕДАКТИРОВАТЬ: журнал ошибок

Строки, которые печатают количество точек в симуляции, взяты из кода перед оператором if main . В этом коде симуляция запускается один раз внутри цикла for, чтобы убедиться, что он работает правильно и дает ожидаемые результаты.

C:\Users\HP\Desktop\experiment>python amplifier_parallel.py
Number of z points:  169   dist:  20.0  mm  dz:  118.343195266  um
Number of t points:  8192.0   window span:  69.0  ps  dt:  8.4228515625  fs

delta_tau:  -6.0
delta_tau:  -3.85714285714
delta_tau:  -1.71428571429
delta_tau:  0.428571428571
delta_tau:  2.57142857143
delta_tau:  4.71428571429
delta_tau:  6.85714285714
delta_tau:  9.0
Simulation Time: 43.1258663953 seconds
Creating pool with 4 processes

pool = <multiprocessing.pool.Pool object at 0x063E66B0>

        Number of z points:  169   dist:  20.0  mm  dz:  118.343195266  um
Number of t points:  8192.0   window span:  69.0  ps  dt:  8.4228515625  fs
...3 more times...

delta_tau:  -6.0
...3more times
delta_tau:  -3.85714285714
... 3 more tiemes
delta_tau:  -1.71428571429
... 3 more tiemes
delta_tau:  0.428571428571
... 3 more tiemes
delta_tau:  2.57142857143
... 3 more tiemes3
delta_tau:  4.71428571429
... 3 more tiemes
delta_tau:  6.85714285714
... 3 more tiemes
delta_tau:  9.0
... 3 more tiemes
Simulation Time: 63.3316095785 seconds
... 3 more times with slightly different times, depending on the worker who did the job
Process PoolWorker-4:
Traceback (most recent call last):
  File "C:\Python27\lib\multiprocessing\process.py", line 232, in _bootstrap
    self.run()
  File "C:\Python27\lib\multiprocessing\process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python27\lib\multiprocessing\pool.py", line 59, in worker
    task = get()
  File "C:\Python27\lib\multiprocessing\queues.py", line 352, in get
    return recv()
AttributeError: 'module' object has no attribute 'calculate'
Number of z points:  169   dist:  20.0  mm  dz:  118.343195266  um
Number of t points:  8192.0   window span:  69.0  ps  dt:  8.4228515625  fs

Process PoolWorker-3:
Traceback (most recent call last):
  File "C:\Python27\lib\multiprocessing\process.py", line 232, in _bootstrap
    self.run()
  File "C:\Python27\lib\multiprocessing\process.py", line 88, in run
    self._target(*self._args, **self._kwargs)
  File "C:\Python27\lib\multiprocessing\pool.py", line 59, in worker
    task = get()
  File "C:\Python27\lib\multiprocessing\queues.py", line 352, in get
    return recv()
AttributeError: 'module' object has no attribute 'calculate'
delta_tau:  -6.0
... this kind of stuff goes on for ever until i control-C

1 Ответ

1 голос
/ 11 сентября 2011

Определить calculate() за пределами блока if __name__=="__main__".Дочерние процессы не видят его в Windows .

...