-- Back to Index --
In this post, we are talking about Process Synchronization
.
We will do in Perl
first.
#!/usr/bin/env perl
use v5.38;
use MCE::Hobo;
use MCE::Shared;
my $data = MCE::Shared->scalar(0);
say "Parent PID: $$\n";
say "Starting workers ...";
my @workers = map { MCE::Hobo->create(\&worker, $_) } (1..5);
$_->join() for @workers;
say "\nFinal value: ", $data->get();
sub worker($id) {
$data->lock;
my $value = $data->get();
$value++;
$data->set($value);
$data->unlock;
say "Worker $id: PID: $$ value: $value";
}
Time to run the script:
$ perl process-sync.pl
Parent PID: 16918
Starting workers ...
Worker 1: PID: 16920 value: 1
Worker 2: PID: 16921 value: 2
Worker 3: PID: 16922 value: 3
Worker 4: PID: 16923 value: 4
Worker 5: PID: 16924 value: 5
Final value: 5
Let's do the same in Python
now.
import os
import multiprocessing as mp
def worker(wid, data, lock):
with lock:
data.value += 1
pid = mp.current_process().pid
print(f"Worker {wid}: PID: {pid} value: {data.value}")
if __name__ == "__main__":
data = mp.Value('i', 0)
lock = mp.Lock()
print(f"Parent process: {os.getpid()}\n")
print("Starting workers ...")
processes = []
for wid in range(1,6):
p = mp.Process(target=worker, args=(wid, data, lock))
processes.append(p)
p.start()
for p in processes:
p.join()
print(f"\nFinal value: {data.value}")
Run the script now:
$ python3 process-sync.py
Parent PID: 16935
Starting workers ...
Worker 1: PID: 16936 value: 1
Worker 2: PID: 16937 value: 2
Worker 3: PID: 16938 value: 3
Worker 4: PID: 16939 value: 4
Worker 5: PID: 16940 value: 5
Final value: 5
-- Back to Index --