2013-10-31 57 views
6

içinde bir örnek yöntemini çağırarak, ben aşağıdakileri yapmanız gerekir:Python Multiprocessing Modülü: Python'un çoklu işlem modülü dayalı bir süreç

-oluşturun bir spesifik Etkinlik tarafından kesilebilir sürekli çalışan süreç.

-Bu işlemde, bir istemciden bir ileti alırsınız ve bu iletiyi nesne örneğinin bir işleyici yöntemine iletir.

Temel kod aşağıdadır (bazı ayrıntılar atlanmıştır). Sorun şu ki, örnek yöntemini (self.enroll (message) çağırmaya çalışıyorum, ancak beklendiği gibi bir etkisi yok. Sebebini biliyorum - süreçler kendi belleklerini kullanıyor, vs. - Can't pickle <type 'instancemethod'> when using python's multiprocessing Pool.map(), sınırlı sayıdaki dekapaj yöntemlerini çözmenin yanı sıra, Yönetici, Kuyruk, Havuz kullanarak farklı yaklaşımları denediler ... çünkü hiçbiri işe yaramadığından, kodu mümkün olduğunca "ham" olarak koymaya karar verdim, böylece niyetimi anlayabilirsiniz. Herhangi bir yardım açığız.

class DistManager: 
    def __init__(self, name, network_address, password): 
     self.name = name 
     self.network_address = network_address 
     self.password = password 
     self.distribution_clients = {} 

    def _run_distribution_process(self): 
     import select 
     while not self.should_stop_distribution_service.is_set(): 
      (sread, swrite, sexc) = select.select([self.distribution_listener], [], [], 0) 
      if (sread): 
       connection = self.distribution_listener.accept() 
       serialized_message = connection.recv() # currently only receiving 
       connection.close() 
       message = pickle.loads(serialized_message) 
       self.enroll(message) # THE PROBLEM IS HERE 

    def start_distribution_service(self, distribution_port): 
     self.distribution_port = distribution_port 
     # patch for making Listener work with select.select during run 
     Listener.fileno = lambda self: self._listener._socket.fileno() 
     self.distribution_listener = Listener(address=(self.network_address, self.distribution_port), 
               authkey=self.password) 
     self.should_stop_distribution_service = Event() 
     self.distribution_process = Process(name='Distribution Runner', target=self._run_distribution_process) 
     self.distribution_process.daemon = True 
     self.distribution_process.start() 

    def stop_distribution_service(self): 
     from time import sleep 
     self.should_stop_distribution_service.set() 
     sleep(1) 
     self.distribution_listener.close() 
     self.distribution_process.terminate() 
     return self.distribution_process.exitcode 

    def _enroll_distribution_client(self, identifier, network_address, phone_number): 
     self.distribution_clients[identifier] = (network_address, phone_number) 

    def enroll(self, message): 
     if type(message.content) is tuple: 
      self._enroll_distribution_client(message.generator_identifier, message.content[0], message.content[1]) 
     else: 
      raise TypeError("Tuple expected") 
     return message.code 
+0

bir açıklama lütfen aşağıya bakın bir yöntem turşu nasıl daha anlaşılması için sınıfın

import copy_reg import types def _reduce_method(meth): return (getattr,(meth.__self__,meth.__func__.__name__)) copy_reg.pickle(types.MethodType,_reduce_method) 

yukarıda gitmeli: Bir çözüm sürecine içindeki nesne örneğini oluşturmak için, ama bu durum böyle değil Diğer sebeplerden dolayı, sürecin dışında yaratılmış bir örnek yöntemini çağırmam gerekiyor - bu merkez nokta. –

cevap