File: server.py

package info (click to toggle)
pyro5 5.16-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 2,124 kB
  • sloc: python: 14,328; makefile: 161; sh: 66; javascript: 62
file content (83 lines) | stat: -rw-r--r-- 2,740 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
from Pyro5.api import expose, Daemon, locate_ns
import sys


@expose
class Mandelbrot(object):
    maxiters = 500

    def calc_line(self, start, res_x, ii, dr, line_nr):
        line = ""
        z = start + complex(0, ii)
        for r in range(res_x):
            z += complex(dr, 0)
            iters = self.iterations(z)
            line += " " if iters >= self.maxiters else chr(iters % 64 + 32)
        return line_nr, line

    def calc_lines(self, start, res_x, dr, di, start_line_nr, num_lines):
        lines = []
        for i in range(num_lines):
            line = ""
            for r in range(res_x):
                z = start + complex(r*dr, i*di)
                iters = self.iterations(z)
                line += " " if iters >= self.maxiters else chr(iters % 64 + 32)
            lines.append((i+start_line_nr, line))
        return lines

    def iterations(self, z):
        c = z
        for n in range(self.maxiters):
            if abs(z) > 2:
                return n
            z = z*z + c
        return self.maxiters


@expose
class MandelbrotColorPixels(object):
    maxiters = 500

    def calc_photoimage_line(self, y, res_x, res_y):
        line = []
        for x in range(res_x):
            rgb = self.mandel_iterate(x, y, res_x, res_y)
            line.append(rgb)
        # tailored response for easy drawing into a tkinter PhotoImage:
        return y, "{"+" ".join("#%02x%02x%02x" % rgb for rgb in line)+"}"

    def mandel_iterate(self, x, y, res_x, res_y):
        zr = (x/res_x - 0.5) * 1 - 0.3
        zi = (y/res_y - 0.5) * 1 - 0.9
        zi *= res_y/res_x  # aspect correction
        z = complex(zr, zi)
        c = z
        iters = 0
        for iters in range(self.maxiters+1):
            if abs(z) > 2:
                break
            z = z*z + c
        if iters >= self.maxiters:
            return 0, 0, 0
        r = (iters+32) % 255
        g = iters % 255
        b = (iters+40) % 255
        return int(r), int(g), int(b)


if __name__ == "__main__":
    # spawn a Pyro daemon process
    # (can't use threads, because of the GIL)
    if len(sys.argv) != 2:
        raise SystemExit("give argument: server_id number")

    server_id = int(sys.argv[1])
    with Daemon() as d:
        with locate_ns() as ns:
            mandel_server = d.register(Mandelbrot)
            mandel_color_server = d.register(MandelbrotColorPixels)
            ns.register("mandelbrot_"+str(server_id), mandel_server, safe=True, metadata={"class:mandelbrot_calc"})
            ns.register("mandelbrot_color_"+str(server_id), mandel_color_server, safe=True, metadata={"class:mandelbrot_calc_color"})
        print("Mandelbrot calculation server #{} ready.".format(server_id))
        d.requestLoop()