name 'aLOCK' is not defined When I add aLOCK = threading.RLock() behind if __name__ == "__main__"
MRAB
python at mrabarnett.plus.com
Thu Aug 9 15:05:01 EDT 2018
On 2018-08-09 16:16, xuanwu348 wrote:
> Hi team
>
> Good day
> The problem I meet when I add "aLOCK = threading.RLock()" to PositionB, the program will report error "name 'aLOCK' is not defined ",
> but when I change this code to PositionA, it can run normally, is there any difference for the code between 'if __name__ == "__main__:"', can you help me, thanks!
>
> The file I was attached, please change the extend ".pyx" to ".py", thanks, code as below, tried python2.7 and python3.4:
>
> import threading
> import time
> from multiprocessing import Process
>
> #PositionA
> aLOCK = threading.RLock()
>
> def Save_runnedCMD(filename, strings):
> aLOCK.acquire()
> with open(filename, "at") as f:
> f.write(str(strings) + "\n\r")
> aLOCK.release()
>
> def runCMD(filename):
> time.sleep(1)
> cmd = "testtest"
> Save_runnedCMD(filename, cmd)
>
>
> def Thr_run(filename):
> t = []
> for i in range(2):
> tt = threading.Thread(target = runCMD, args=(filename,))
> tt.start()
> t.append(tt)
> for tt in t:
> tt.join()
>
> if __name__ == "__main__":
> filename = "./testaaaaa.log"
>
> #PositionB
> #aLOCK = threading.RLock()
>
> while 1:
> t1 = Process(target=Thr_run, args=(filename, ))
> t1.start()
> t1.join()
>
> Error info as below:
> D:\Appppp>python testa.py
> Exception in thread Thread-1:
> Traceback (most recent call last):
> File "C:\Python34\lib\threading.py", line 921, in _bootstrap_inner
> self.run()
> File "C:\Python34\lib\threading.py", line 869, in run
> self._target(*self._args, **self._kwargs)
> File "D:\Appppp\testa.py", line 15, in runCMD
> Save_runnedCMD(filename, cmd)
> File "D:\Appppp\testa.py", line 7, in Save_runnedCMD
> aLOCK.acquire()
> NameError: name 'aLOCK' is not defined
>
> Exception in thread Thread-2:
> Traceback (most recent call last):
> File "C:\Python34\lib\threading.py", line 921, in _bootstrap_inner
> self.run()
> File "C:\Python34\lib\threading.py", line 869, in run
> self._target(*self._args, **self._kwargs)
> File "D:\Appppp\testa.py", line 15, in runCMD
> Save_runnedCMD(filename, cmd)
> File "D:\Appppp\testa.py", line 7, in Save_runnedCMD
> aLOCK.acquire()
> NameError: name 'aLOCK' is not defined
>
When you run the script, __name__ will be "__main__".
When script uses the multiprocessing module to run the function
"Thr_run" in another process, it actually starts another instance of
itself, and in that other instance, name _won't_ be "__main__".
Here's a simple example:
from multiprocessing import Process
def test_func():
print('test_func')
print('__name__ is {!a}'.format(__name__))
if __name__ == "__main__":
p = Process(target=test_func)
p.start()
p.join()
When run, it prints:
__name__ is '__main__'
__name__ is '__mp_main__'
test_func
So, if you put the lock at PositionB, it won't be created by the subprocess.
More information about the Python-list
mailing list