我试图从外部设置Process类的类变量,以指示进程内部的while循环应该完成。
然而,尽管变量似乎设置得很好,但旧值是从run(self)
检索的。我试过使用线程。线程,这工作。然而,Thread的问题是,它并不总是在调用start()
时启动。有时它等待scp
进程完成,这就杀死了在这种情况下使用线程的意义。
from multiprocessing import Process
class LogParserThread(Process):
def __init__(self):
super(LogParserThread, self).__init__()
self.scp_done = False
self.flights_to_add = ()
def stop(self):
self.scp_done = True
print 'Stopping: ' + str(self.scp_done)
def run(self):
file_list = ()
while self.scp_done is False or len(file_list) > 0:
print 'Status ' + str(self.scp_done) + ' ' + str(len(file_list))
if (len(file_list) > 1):
print ' Case 1 '
f = file_list[0]
os.system('rm -rf ' + f + '*')
if (len(file_list) is 1 and self.scp_done is True):
print ' Case 2 '
f = file_list[0]
os.system('rm -rf ' + f + '*')
update file_list
files_to_copy = "file1 file2 file3"
parser_thread = LogParserThread()
parser_thread.start()
print 'BEFORE COPY ' + str(parser_thread.scp_done)
os.system('scp -C remote:' + files_to_copy + ' ' + '/destination/')
print 'AFTER COPY ' + str(parser_thread.scp_done)
parser_thread.stop()
print 'AFTER STOP ' + str(parser_thread.scp_done)
parser_thread.join()
print 'AFTER JOIN ' + str(parser_thread.scp_done)
这些是测试运行的打印:
BEFORE COPY: False
AFTER COPY False
Stopping: True
AFTER STOP True
Status False 1
Status False 1
Status False 1
Status False 1
Status False 1
Status False 1
在Unix上,子进程是使用os.fork
生成的。fork复制全局变量(或使用写时复制),这样每个进程(父进程和子进程)都有自己的全局变量副本。在Windows上,会生成第二个Python进程并导入调用模块。在这两种情况下(在Unix或Windows上),当父进程修改一个全局变量时,同名的子进程的全局变量不会改变。因此,在主进程中调用parser_thread.stop()
不会影响子进程中self.scp_done
的值。
multiprocessing
确实提供了一些可以促进进程间状态共享的对象,比如mp.Value
。对于简单的布尔值,也可以使用mp。事件:
import multiprocessing as mp
import time
class LogParserProcess(mp.Process):
def __init__(self):
super(LogParserProcess, self).__init__()
self.done = mp.Event()
self.flights_to_add = ()
def stop(self):
self.done.set()
print 'Stopping: ' + str(self.done.is_set())
def run(self):
file_list = ()
while not self.done.is_set() or len(file_list) > 0:
print 'Status ' + str(self.done.is_set()) + ' ' + str(len(file_list))
files_to_copy = "file1 file2 file3"
proc = LogParserProcess()
proc.start()
print 'BEFORE COPY ' + str(proc.done.is_set())
time.sleep(1)
print 'AFTER COPY ' + str(proc.done.is_set())
proc.stop()
print 'AFTER STOP ' + str(proc.done.is_set())
proc.join()
print 'AFTER JOIN ' + str(proc.done.is_set())
打印
BEFORE COPY False
Status False 0
...
Status False 0
AFTER COPY False
Status False 0
Status False 0
Status False 0
Stopping: True
AFTER STOP True
AFTER JOIN True