2014-07-24 6 views
6

Próbuję użyć kolejki z modułu multiprocessing.Queue. wdrażania (https://docs.python.org/3.4/library/multiprocessing.html#exchanging-objects-between-processes) wykorzystujeParametr ctx w trybie wieloprocesowym.Queue

q = Queue() 

jako przykład dla instancji. Gdy próbuję to, pojawia się następujący błąd:

TypeError: __init__() missing 1 required keyword-only argument: 'ctx' 

Googling problem wychowane w ten sposób:

http://bugs.python.org/issue21367

Skąd mam wiedzieć, czy to jest stała? Czy nie jest możliwe korzystanie z wieloprocesowości. Jeśli nie, w jaki sposób mogę uzyskać potrzebne obiekt ctx (a co to jest?)

+0

Jaka wersja Pythona używasz? – dano

+0

Używam 3.4.1 – user3710165

+1

W jaki sposób importujesz 'Queue'? – dano

Odpowiedz

5

Brzmi jak nie jesteś importowanie Queue bezpośrednio od multiprocessing. Po wprowadzeniu kontekstów większość obiektów importowanych z pakietu najwyższego poziomu stała się funkcjami, które wewnętrznie pobierają kontekst, a następnie przekazują je do podstawowego inicjalizatora klasy, a nie same klasy. Na przykład, tutaj jest to, co jest teraz multiprocessing.Queue:

def Queue(self, maxsize=0): 
    '''Returns a queue object''' 
    from .queues import Queue 
    return Queue(maxsize, ctx=self.get_context()) 

Jeśli było importować multiprocessing.queues.Queue bezpośrednio i spróbować go instancję, dostaniesz błąd pan widzi. Ale powinno to działać poprawnie, jeśli importujesz je bezpośrednio z domeny multiprocessing.

Obiekt kontekstu mówi, multiprocessing, który z jest używany. multiprocessing.Queue wewnętrznie używa multiprocessing.Lock, który musi znać poprawny kontekst, aby działał poprawnie.

0

ten sposób powinno wieloprocesorowe klasy Queue być dziedziczone z Pythonem 3.4 i on:

from multiprocessing.queues import Queue 

class BlockedQueue(Queue): 
    def __init__(self, maxsize=-1, block=True, timeout=None): 
     self.block = block 
     self.timeout = timeout 
     super().__init__(maxsize, ctx=multiprocessing.get_context())