2017-03-07 2 views
0

Wie kann ich eine multiprocessing.Process innerhalb __init__() einer Klasse, eine andere Funktion in dieser Klasse Targeting? Die Klasse selbst soll kein Prozess sein. __init__() soll sich auf eine Klassenvariable beziehen, die in der Klasse zugewiesen ist, nicht innerhalb irgendeiner Funktion.Starten Sie multiprocessing.Process der Methode in der Klasse, von __init __()

Arbeitscode:

import multiprocessing as mp 
class SomeClass: 
    def __init__(self): 
     p_process1 = mp.Process(target=self.process1) 
     p_process1.start() 

    def process1(self): 
     while True: 
      pass 

Der Code Ich möchte:

import multiprocessing as mp 
class SomeClass: 
    def __init__(self): 
     self.p_process1.start() 

    def process1(self): 
     while True: 
      pass 
    p_process1 = mp.Process(target=process1) 

Wenn ich jetzt versuchen, den Code Ich will zu laufen, bekomme ich eine Fehlermeldung:

Process Process-1: 
Traceback (most recent call last): 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/process.py", line 249, in _bootstrap 
    self.run() 
    File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/multiprocessing/process.py", line 93, in run 
    self._target(*self._args, **self._kwargs) 
TypeError: process1() missing 1 required positional argument: 'self' 
+0

seien Sie vorsichtig mit den vorgeschlagenen Änderungen wie [Ihr] (https://stackoverflow.com/review/suggested-edits/16803834): Die Sprache wurde bereits festgelegt ([tag: go]), und Sie können Mach keine zufälligen Bearbeitungen. –

Antwort

1

Nun das Problem eindeutig angibt: die multiprocessingruft es ohne Parameter, und Sie erwarten jedoch eine: self. In diesem Fall können Sie lösen es mögen:

import multiprocessing as mp 

class SomeClass: 
    def __init__(self): 
     self.p_process1.start() 

    @staticmethod 
    def process1(): # so no parameter 
     while True: 
      pass 
    p_process1 = mp.Process(target=process1)

Wenn jedoch Sie einen Verweis auf self benötigen, gibt es keine andere Wahl, als das Verfahren in einem Zusammenhang zu konstruieren, in dem Sie einen Verweis auf self haben. Schließlich, wenn Sie self.process1 holen , Sie keinen Verweis auf SomeClass.process1 erhalten, erhalten Sie eine Funktion, die auf functools.partial(SomeClass.process1,self=self) gleich ist, so dass Sie tatsächlich eine Funktion haben, wo self in implizit gefüllt ist.

+0

In PyCharm bekomme ich eine Fehlermeldung, dass ich einen ersten Parameter haben muss. Es läuft immer noch so, wie du es gemacht hast. Soll ich es zu einer statischen Methode machen? – Andreas

+0

@Andreas: Ja, das ist in der Tat, wie man die Pycharm-Warnung löst. –

+0

Sind Sie sicher, dass es auf diese Weise keine Fehler gibt? Gibt es etwas, was ich anstelle von "Selbst" stattdessen, wie "CSL", wenn ich mich richtig erinnere? – Andreas

1

process1 ist eine gebundene Funktion, es braucht Klasseninstanz als self, um das erste Argument zu sein, wenn es aufgerufen wird.

Wenn Sie nur diesen Bogen wollen, kann helfen.

import multiprocessing as mp 
class SomeClass: 
    def __init__(self): 
     self.p_process1.start() 

    def process1(self): 
     while True: 
      pass 

    @property 
    def p_process1(self): 
     return mp.Process(target=self.process1) 

SomeClass() 
+0

Wenn ich das tue, kann ich 'SomeClass() .process1()', aber nicht 'SomeClass.process1()' verwenden, oder kann ich keine davon benutzen? Kann process1 nur von '__init __()' aufgerufen werden? – Andreas

+0

Führt dies auch immer '__init __()'? – Andreas

+0

Ist SomeClass eine objektorientierte Klasse und Sie möchten ihre Instanz verwenden? Wenn nicht, und Sie möchten SomeClass.process1() aufrufen, müssen Sie es als statische Methode definieren, wie @Willem Van Onsem sagte.Und du brauchst nicht einmal __init__. – Valens

Verwandte Themen