Python :无法从外部设置进程变量



我试图从外部设置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

相关内容

  • 没有找到相关文章

最新更新