Rahul Jacob
Rahul Jacob

Reputation: 1

An error while using locks in multiprocessing in Python

I'm a beginner learning python and ran into some issues while using locks during multiprocessing. I get an exit code 0 and the right answer but still have some sort of error message which I really don't fully understand. Here's The code I've written-

import time
import multiprocessing


def deposit(balance):
     for i in range(100):
         time.sleep(0.01)
         lck.acquire()
         balance.value += 1
         lck.release()

def withdraw(balance):
    for i in range(100):
        time.sleep(0.01)
        lck.acquire()
        balance.value -= 1
        lck.release()


if __name__ == '__main__':
    balance = multiprocessing.Value('i', 200)
    lck = multiprocessing.Lock()
    d = multiprocessing.Process(target=deposit, args=(balance,))
    w = multiprocessing.Process(target=withdraw, args=(balance,))
    d.start()
    w.start()
    d.join()
    w.join()
    print(balance.value)

and here's the error I get

 `Process Process-1:
  Traceback (most recent call last):
  File "C:\Users\rahul\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 
  315, in _bootstrap
  self.run()
  File "C:\Users\rahul\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 
  108, in run
  self._target(*self._args, **self._kwargs)
  File "C:\Users\rahul\PycharmProjects\pythonProject\LearningPython.py", line 10, in deposit
  lck.acquire()
  NameError: name 'lck' is not defined
  Process Process-2:
  Traceback (most recent call last):
  File "C:\Users\rahul\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 
  315, in _bootstrap
  self.run()
  File "C:\Users\rahul\AppData\Local\Programs\Python\Python39\lib\multiprocessing\process.py", line 
  108, in run
  self._target(*self._args, **self._kwargs)
  File "C:\Users\rahul\PycharmProjects\pythonProject\LearningPython.py", line 17, in withdraw
  lck.acquire()
  NameError: name 'lck' is not defined
  200

Process finished with exit code 0

Upvotes: 0

Views: 235

Answers (2)

Simon Notley
Simon Notley

Reputation: 2136

The problem here is that lck is out of scope of your child processes. Global variables aren't shared across processes. Try passing the lock into the processes.

Alternatively use threads as suggested in kahn's answer. They are much friendlier and still work fine in this case.

import time
import multiprocessing


def deposit(balance,lck):
     for i in range(100):
         time.sleep(0.01)
         lck.acquire()
         balance.value += 1
         lck.release()

def withdraw(balance,lck):
    for i in range(100):
        time.sleep(0.01)
        lck.acquire()
        balance.value -= 1
        lck.release()


if __name__ == '__main__':
    balance = multiprocessing.Value('i', 200)
    lck = multiprocessing.Lock()
    d = multiprocessing.Process(target=deposit, args=(balance,lck))
    w = multiprocessing.Process(target=withdraw, args=(balance,lck))
    d.start()
    w.start()
    d.join()
    w.join()
    print(balance.value)

Upvotes: 2

Kahn
Kahn

Reputation: 193

Because deposit and withdraw run in other processes.In their view,the process is not __main__,so the if statement is not executed and lck is not defined.

Try Run

import os
import multiprocessing


def deposit(balance):
    print(os.getpid(),__name__)


def withdraw(balance):
    print(os.getpid(),__name__)


if __name__ == '__main__':
    print(os.getpid(), __name__)
    balance = multiprocessing.Value('i', 200)
    lck = multiprocessing.Lock()
    d = multiprocessing.Process(target=deposit, args=(balance,))
    w = multiprocessing.Process(target=withdraw, args=(balance,))
    d.start()
    w.start()
    d.join()
    w.join()

In my case ,it shows

19604 __main__
33320 __mp_main__
45584 __mp_main__

Your code can run if you put lck = multiprocessing.Lock() outside if.But I'm sure it's not what you want.

You should use threading instead of multiprocess in this case,and have a look at difference between multi-thread and multi-process.

Upvotes: -1

Related Questions