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.
--
https://mail.python.org/mailman/listinfo/python-list