15

オブジェクトとそのメソッドを Python の複数のプロセス間で共有する必要があります。managers(モジュールで)使用しようとしていますmultiprocessingが、クラッシュします。これは、2 つのプロセス間の共有オブジェクトが 4 つのメソッドを持つ単なる数字のリストであるプロデューサー/コンシューマーのばかげた例です。

from multiprocessing import Process, Condition, Lock  
from multiprocessing.managers import BaseManager  
import time, os  
  
lock = Lock()  
waitC = Condition(lock)  
waitP = Condition(lock)  
  
class numeri(object):  
    def __init__(self):  
        self.nl = []  
      
    def getLen(self):  
        return len(self.nl)  
      
    def stampa(self):  
        print self.nl  
          
    def appendi(self, x):  
        self.nl.append(x)  
      
    def svuota(self):  
        for i in range(len(self.nl)):  
            del self.nl[0]  
      
class numManager(BaseManager):  
    pass  
  
numManager.register('numeri', numeri, exposed = ['getLen', 'appendi', 'svuota', 'stampa'])  
  
def consume(waitC, waitP, listaNumeri):  
    lock.acquire()  
    if (listaNumeri.getLen() == 0):  
        waitC.wait()  
    listaNumeri.stampa()  
    listaNumeri.svuota()  
    waitP.notify()  
    lock.release()  
      
def produce(waitC, waitP, listaNumeri):  
    lock.acquire()  
    if (listaNumeri.getLen() > 0):  
        waitP.wait()  
    for i in range(10):  
        listaNumeri.appendi(i)  
    waitC.notify()  
    lock.release()  
  
      
def main():  
    mymanager = numManager()  
    mymanager.start()  
    listaNumeri = mymanager.numeri()  
    producer = Process(target = produce, args =(waitC, waitP, listaNumeri,))  
    producer.start()  
    time.sleep(2)  
    consumer = Process(target = consume, args =(waitC, waitP, listaNumeri,))  
    consumer.start()  
  
main() 

とにかく、それはいつもそのようにクラッシュし、私にこれを教えてくれます:

Process Process-3:
Traceback (most recent call last):
  File "/usr/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
    self.run()
  File "/usr/lib/python2.7/multiprocessing/process.py", line 114, in run
    self._target(*self._args, **self._kwargs)
  File "./trySemProc.py", line 61, in consume
    if (listaNumeri.getLen() == 0):
  File "<string>", line 2, in getLen
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 755, in _callmethod
    self._connect()
  File "/usr/lib/python2.7/multiprocessing/managers.py", line 742, in _connect
    conn = self._Client(self._token.address, authkey=self._authkey)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 169, in Client
    c = SocketClient(address)
  File "/usr/lib/python2.7/multiprocessing/connection.py", line 293, in SocketClient
    s.connect(address)
  File "/usr/lib/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)
error: [Errno 2] No such file or directory

それで、問題は何ですか?managersオブジェクトとそのメソッドを共有するには、これらをどのように使用すればよいですか?

4

1 に答える 1

7

子プロセスが実行を継続する前にメイン プロセスが終了しないように、プロセスに参加する必要があります。したがって、コードに結合を追加します。

 consumer.join()
 producer.join()

start()プロセスのメソッドを呼び出した後。

于 2012-08-14T12:03:31.110 に答える