Странное поведение с питоном при многопроцессорной обработке - PullRequest
0 голосов
/ 12 декабря 2018

Я кодирую генератор набора Мандельброта и распараллелил его с 4 подпроцессами, каждый из которых вычисляет свою область набора Мандельброта.

Код распараллеливания следующий:

def run_threads(self):    # Parallelize calcs with 4 subprocesses
        with Pool(processes=4) as pool:
            p1 = pool.apply_async(self.run, (0, int(self.width / 2), 0, int(self.width / 2)))
            p2 = pool.apply_async(self.run, (0, int(self.width / 2), int(self.width / 2), self.width))
            p3 = pool.apply_async(self.run, (int(self.width / 2), self.width, 0, int(self.width / 2)))
            p4 = pool.apply_async(self.run, (int(self.width / 2), self.width, int(self.width / 2), self.width))

            r1 = (p1.get(timeout=10))
            r2 = (p2.get(timeout=10))
            r3 = (p3.get(timeout=10))
            r4 = (p4.get(timeout=10))

        #r2 = self.run(0, int(self.width / 2), int(self.width / 2), self.width)

        for i in range(0, int(self.width / 2)):
            for j in range(0, int(self.width / 2)):
                self.values[i, j] = r1[i,j]


        for i in range(0, int(self.width / 2)):
            for j in range(int(self.width / 2), self.width):
                self.values[i, j] = r2[i,j]


        for i in range(int(self.width / 2), self.width):
            for j in range(0, int(self.width / 2)):
                self.values[i, j] = r3[i,j]


        for i in range(int(self.width / 2), self.width):
            for j in range(int(self.width / 2), self.width):
                self.values[i, j] = r4[i,j]

но вывод равен this

Две правильно представленные области соответствуют r1 и r4, поэтому r2 и r3 не работают должным образом.Если я запускаю закомментированный код для r2, вывод теперь правильный, поэтому я не знаю, что я делаю неправильно.

PS: self.values ​​и значения - цвет каждого пикселя.

Спасибо

...