forked from anhtuank7c/learn-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample03.py
More file actions
55 lines (39 loc) · 1.54 KB
/
Copy pathexample03.py
File metadata and controls
55 lines (39 loc) · 1.54 KB
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
from multiprocessing import Lock, Pipe, Queue, Process
from multiprocessing.connection import PipeConnection
from multiprocessing.synchronize import Lock as LockType
from typing import Any
def queue_worker(queue: "Queue[str]", lock: LockType):
with lock:
print("Task executed")
queue.put("Done")
def pipe_worker(conn: PipeConnection):
conn.send("Data from pipe worker")
conn.close()
def consumer(queue: "Queue[Any]", parent_conn: PipeConnection, lock: LockType):
with lock:
print(f"Consumer received from queue: {queue.get()}")
print(f"Consumer received from pipe: {parent_conn.recv()}")
if __name__ == "__main__":
# for exchange data between processes safely
queue: "Queue[Any]" = Queue()
# For synchronization (ensures only one process can access at a time)
lock: LockType = Lock()
# Pipe for two-way communications between processes
parent_conn, child_conn = Pipe()
# create separate processes
# queue base process
queue_process = Process(target=queue_worker, args=(queue, lock))
# pipe base process
pipe_process = Process(target=pipe_worker, args=(child_conn,))
# consumer that receive data
consumer_process = Process(target=consumer, args=(queue, parent_conn, lock))
# start processes
queue_process.start()
pipe_process.start()
# wait for both processes to finish
queue_process.join()
pipe_process.join()
# start the consumer process after data is available
consumer_process.start()
consumer_process.join()
print("Done")