Skip to content

Instantly share code, notes, and snippets.

@manwar
Last active February 19, 2025 11:16
Show Gist options
  • Save manwar/8ce2a5878f190cbfa39a3a177d40929f to your computer and use it in GitHub Desktop.
Save manwar/8ce2a5878f190cbfa39a3a177d40929f to your computer and use it in GitHub Desktop.
Process synchronization in Perl and Python.

-- 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 --


Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment