Python 2.6: обработка локального хранилища при использовании многопроцессорной обработки. - PullRequest
1 голос
/ 18 марта 2011

Я пытаюсь создать сценарий Python, который имеет пул рабочих процессов (используя mutiprocessing.Pool) для большого набора данных.

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

Псудокод:

def work(data):
    #connection should be unique per process
    connection.put(data)
    print 'work done with connection:', connection

if __name__ == '__main__':
    pPool = Pool() # pool of 4 processes
    datas = [1..1000]
    for process in pPool:
        #this is the part i'm asking about // how do I really do this?
        process.connection = Connection(conargs)
    for data in datas:
       pPool.apply_async(work, (data))

Ответы [ 4 ]

1 голос
/ 18 марта 2011

Я думаю, что-то подобное должно работать (не проверено)

def init(*args):
    global connection
    connection = Connection(*args)
pPool = Pool(initializer=init, initargs=conargs) 
1 голос
/ 18 марта 2011

Может быть проще создать mp.Process es напрямую (без mp.Pool):

import multiprocessing as mp
import time

class Connection(object):
    def __init__(self,name):
        self.name=name
    def __str__(self):
        return self.name

def work(inqueue,conn):
    name=mp.current_process().name
    while 1:
        data=inqueue.get()
        time.sleep(.5)
        print('{n}: work done with connection {c} on data {d}'.format(
            n=name,c=conn,d=data))
        inqueue.task_done()

if __name__ == '__main__':
    N=4
    procs=[]
    inqueue=mp.JoinableQueue()
    for i in range(N):
        conn=Connection(name='Conn-'+str(i))
        proc=mp.Process(target=work,name='Proc-'+str(i),args=(inqueue,conn))
        proc.daemon=True
        proc.start()

    datas = range(1,11)
    for data in datas:
        inqueue.put(data)
    inqueue.join()

приводит к

Proc-0: work done with connection Conn-0 on data 1
Proc-1: work done with connection Conn-1 on data 2
Proc-3: work done with connection Conn-3 on data 3
Proc-2: work done with connection Conn-2 on data 4
Proc-0: work done with connection Conn-0 on data 5
Proc-1: work done with connection Conn-1 on data 6
Proc-3: work done with connection Conn-3 on data 7
Proc-2: work done with connection Conn-2 on data 8
Proc-0: work done with connection Conn-0 on data 9
Proc-1: work done with connection Conn-1 on data 10

Обратите внимание, что числа Proc соответствуютодин и тот же Conn номер каждый раз.

0 голосов
/ 07 декабря 2018

Процесс локального хранилища довольно легко реализовать в качестве контейнера сопоставления, для тех, кто попадает сюда из Google, ищет что-то подобное (обратите внимание, что это Py3, но его легко конвертировать в синтаксис 2 (просто наследовать от object):

class ProcessLocal:
    """
    Provides a basic per-process mapping container that wipes itself if the current PID changed since the last get/set.
    Aka `threading.local()`, but for processes instead of threads.
    """

    __pid__ = -1

    def __init__(self, mapping_factory=dict):
        self.__mapping_factory = mapping_factory

    def __handle_pid(self):
        new_pid = os.getpid()
        if self.__pid__ != new_pid:
            self.__pid__, self.__store = new_pid, self.__mapping_factory()

    def __delitem__(self, key):
        self.__handle_pid()
        return self.__store.__delitem__(key)

    def __getitem__(self, key):
        self.__handle_pid()
        return self.__store.__getitem__(key)

    def __setitem__(self, key, val):
        self.__handle_pid()
        return self.__store.__setitem__(key)

Подробнее @ https://github.com/akatrevorjay/pytutils/blob/develop/pytutils/mappings.py

0 голосов
/ 18 марта 2011

Вы хотите, чтобы объект находился в общей памяти, верно?

Python имеет некоторую поддержку для этого в своей стандартной библиотеке, но это довольно плохо. Насколько я помню, только целые числа и некоторые другие примитивные типы могут быть сохранены.

Попробуйте POSH (общий доступ к объектам Python): http://poshmodule.sourceforge.net/

...