Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- from collections import deque
- from itertools import count
- from typing import Deque, List
- from simple_pipe import *
- class SillyDemoPrimeTest:
- _primes: Deque
- _p_slice: List[int]
- _counter: Iterable[int]
- def __init__(self):
- self._primes = deque((2, 3, 5, 7)) # head start
- self._p_slice = [0] * 20
- self._counter = count(8)
- def print_next20(self) -> str:
- ps = self._primes
- p_slice = self._p_slice
- counter = self._counter
- for i in range(20):
- for n in counter:
- if 0 not in (n % j for j in ps):
- ps.append(n)
- p_slice[i] = n
- break
- return str(p_slice)
- ppc1 = ProcessPairController()
- ppc2 = ProcessPairController()
- send, receive = Pipe(True)
- lock_send_receive = Lock()
- done_send_pt1 = Event()
- done_send_pt2 = Event()
- done_receive_pt1 = Event()
- done_receive_pt2 = Event()
- def prime_test(sender: bool):
- test = SillyDemoPrimeTest()
- wait_progress_marker = (GeneratePPCExchange.send_sync if sender else GeneratePPCExchange.receive_sync)(ppc1, ppc2)
- pab = ('Process AAA' if sender else 'Process BBB')
- dp1, dp2 = ((done_send_pt1, done_send_pt2) if sender else (done_receive_pt1, done_receive_pt2))
- for i in range(100):
- wait_progress_marker()
- output = test.print_next20()
- with lock_send_receive:
- send.send(f'{pab} on iteration #{i}.\n')
- dp1.set()
- event_wait_clear(dp2)
- wait_progress_marker()
- with lock_send_receive:
- send.send(f'{pab} fount {output}.\n')
- dp1.set()
- event_wait_clear(dp2)
- with lock_send_receive: # close
- dp1.set()
- threadS = Process(target = prime_test, name = "AAA", args = (True,))
- threadR = Process(target = prime_test, name = "BBB", args = (False,))
- threadS.start()
- threadR.start()
- out = StringIO()
- locks = cycle(((done_send_pt1, done_send_pt2), (done_receive_pt1, done_receive_pt2)))
- first_blank = True
- while True:
- l1, l2 = next(locks)
- event_wait_clear(l1)
- with lock_send_receive:
- if receive.poll() == 0:
- if first_blank:
- first_blank = False
- continue
- else:
- break
- out.write(receive.recv())
- l2.set()
- threadS.join()
- threadR.join()
- out.seek(0)
- print(out.read())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement