0

functionsdef refresh_image_list(self)およびdef refresh_server_list(self): 両方とも updateself.imagesおよびself.servers順守された順序で。オブジェクトの作成時に問題なく実行されます。

Python のマルチプロセッシング プロセスでそれらを問​​題なく呼び出すことができます...1 つを除いて... self.images と self.servers に追加された情報は保持されません。繰り返しますが、マルチプロセッシングを使用しない場合は問題ありません... マルチプロセッシング プロセスを使用する場合のみです。image_list()関数をandに切り替えて Process で実行すると、関数が正しく実行されることを確認server_list()し、リストを正常に出力しました。しかし、ここでも、self.serversおよび self.images の情報はその後保持されませんでした。

class Account():
    def __init__(self, username, api, pipe_object):
        self.images = []
        self.servers = []
        self.images_timestamp = None
        self.servers_timestamp = None
        #needed a dictionary instead of 
        #list/tuple. This works best for 
        #the generator.
        self.regions = {
                "DFW" : pyrax.connect_to_cloudservers("DFW"),
                "ORD" : pyrax.connect_to_cloudservers("ORD"),
                "SYD" : pyrax.connect_to_cloudservers("SYD")
                }

        p1 = Process(target = self.refresh_server_list, args=())
        p2 = Process(target = self.refresh_image_list, args=())
        p1.start()
        p2.start()
        p2.join()
        p1.join()

    flavors = None 


    def refresh_server_list(self):
    self.servers = []
        self.servers_timestamp = time.strftime(
            "%I:%M:%S", time.localtime()
        )
        with Redirect(self.pipe_object):
            print "\nRefreshing server cache...hold on!"

        for region, value in self.regions.iteritems():
            region_servers = value.servers.list()
            for region_servers in generator(region_servers, region):
                self.servers.append(region_servers)

        with Redirect(self.pipe_object):
            print "\nServer cache completed!"

    def server_list(self):
        if not self.servers:
            self.refresh_server_list()

        with Redirect(self.pipe_object):
            print_header("Active Server List", "-")
            for srv in self.servers:
                print "\nName: %s" % srv.name
                print "Created: %s" % srv.created
                print "Progress: %s" % srv.progress
                print "Status: %s" % srv.status
                print "URL: %s" % srv.links[0]["href"]
                print "Networks: %s" % srv.networks
            print "\nLast Refresh time: %s" % self.servers_timestamp

    def refresh_image_list(self):
    self.images = []
        self.images_timestamp = time.strftime(
            "%I:%M:%S", time.localtime()
        )
        with Redirect(self.pipe_object):
           # print_header("Active Image List", "-")
            print "\nRefreshing image cache...hold on!"

        for region, value in self.regions.iteritems():
            region_images = value.images.list()
            for region_images in generator(region_images, region):
                self.images.append(region_images)

        with Redirect(self.pipe_object):
            print "\nImage cache completed!"

    def image_list(self):
        if not self.images:
            self.refresh_image_list()

        with Redirect(self.pipe_object):
            print_header("List Images", "-")
            for img in self.images:
                print (
                    str(self.images.index(img)+1) + ") "
                    + "Name: %s\n    ID: %s Status: %s" %
                    (img.name, img.id, img.status)
                    )
            print "\nLast Refresh time: %s" % self.images_timestamp
4

1 に答える 1

1

新しいプロセスを開始すると、同じアドレス空間を共有せず、プロセスデータがコピーされるため、子プロセスからメインプロセスの元のオブジェクトを変更できないため、これは明らかです。同じアドレス空間を共有しているため、機能するスレッドを使用していた場合。

オブジェクトを変更したい場合は、クラスを使用して共有するか、 & CoManagerを使用できます。multiprocessing.Array

または、リストを共有する代わりに、キュー/パイプまたは multiprocessing モジュールで使い慣れたものを使用して、何らかの出力で新しい変更されたリストを返すことができます。

于 2013-08-11T21:55:08.907 に答える