簡體   English   中英

在共享對象扭曲的情況下分叉多個過程

[英]Forking multiple process in twisted with shared object

我想分叉多個進程。 這里的討論中,我知道Twisted和多重處理彼此不兼容。 的確,我可以從不同的終端啟動單獨的進程來達到相同的效果,但是我不能這樣做。

我想在不同的python進程之間共享一個大對象(以GB為單位)(由於計算機上的RAM限制,無法多次在RAM上加載同一對象)

我想做的是

  1. 在單個進程中異步啟動多個Rabbit-mq使用者。
  2. 用公共共享對象分叉多個此類進程,以利用系統中的所有CPU。

我能夠實現第一步。 這是我想出的-

import pika

class PikaFactory(protocol.ReconnectingClientFactory):
    def __init__(self, parameters, task_number=0, shared_obj=None):
        self.parameters = parameters
        self.task_count = total_tasks
        self.task_number = task_number
        self.shared_obj= shared_obj

    def buildProtocol(self, addr):
        self.resetDelay()
        logger.info('Task: %s, Connected' % self.task_number)
        proto = twisted_connection.TwistedProtocolConnection(self.parameters)
        # run is a async function that consumes the rabbit-queue
        proto.ready.addCallback(run, self.task_number, self.shared_obj)
        return proto

    # Rest of the implementation ...........

def run_tasks(shared_obj):
    from twisted.internet import reactor
    try:
        parameters = pika.ConnectionParameters(**CONNECTION_PARAMETERS)
        factory = PikaFactory(parameters, 0, shared_obj)

        for i in range(total_tasks):
            # Launch multiple async-tasks in the same process
            reactor.connectTCP(parameters.host, parameters.port, factory)

        logger.info(' [*] Waiting for messages. To exit press CTRL+C')
        reactor.run()
    except:
        logger.exception("Error")
        reactor.stop()

if __name__ == '__main__':
    obj = Fibonacci()
    run_tasks(obj)

現在分叉多個進程,我已經編寫了這段代碼。

from multiprocessing.managers import BaseManager
class MyManager(BaseManager):
    """
    This Manager is responsible for coordinating shared
    information state between all processes
    """
    pass

# Register your custom "Fibonacci" class with the manager
# This is the class I want to share among multiple processes
MyManager.register('Fibonacci', Fibonacci)

def Manager():
    m = MyManager()
    m.start()
    return m

def run_multiple_processes():
    manager = Manager()
    # object I want to share among multiple processes 
    fibonacci = manager.Fibonacci()
    pool = multiprocessing.Pool(processes=workers)
    for i in range(0, workers):
        pool.apply_async(run_tasks, (fibonacci, ))

    # Stay alive
    try:
        while True:
            continue
    except KeyboardInterrupt:
        logger.error(' [*] Exiting...')
        pool.terminate()
        pool.join()

我在運行上述代碼時遇到一些隨機錯誤,例如-

builtins.AttributeError: '_SIGCHLDWaker' object has no attribute 'doWrite'

啟動多個進程並在它們之間共享自定義對象的扭曲方式是什么。 將不會對該對象執行任何寫操作,該對象僅用於從其屬性讀取。

提前致謝。

在搜索時,我遇到了這種與python多處理不兼容的扭曲現象 在這篇文章中,答案僅是引用他的話-

“在創建子進程之前,不要加載任何Twisted。這意味着直到創建子進程后,才導入Twisted。”

感謝@ Jean-Paul Calderone的有用評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM