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
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
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. –