流程在预期的Python

时间:2017-12-11 22:01:09

标签: python mongodb process

我在Pycharm中编写一个简单的Python程序,将csv数据库导入Mongodb,导入时显示进度条,导入所有文档后,运行其他一些函数......

由于我使用子进程指令来运行mongoimport命令,我必须做一些等待在mongimport之前不执行的其他函数。

问题出现了:如果我使用subprocess.wait(),进度条会停止更新,直到mongoimport结束,否则如果我使用sleep(),同样的情况会发生...

所以我尝试运行mongoimport子进程和在同一进程中更新进度条的函数。然后我使用“空”while循环检查是否process.is_alive()所以主程序没有,而进程导入和更新进度条...但它在预期之前退出循环!早在mongoimport之前,进度条功能都没有结束。

以下是代码:

def mainFunction(self):
    process1 = Process(target=self.execc())
    process1.start()

    while process1.is_alive():
        print("IM IN PROCESS 1")

    # THIS IS PRINTED BEFORE "execc()" ENDS
    print("IM OUT!")

    # other functions
    self.toISO()
    self.createFrec()
    self.sort()


def execc(self):

    p = subprocess.Popen(['mongoimport', '-d', 'tfg', '-c', 'myCol', '--type', 'csv', '--file', './myFile.csv', '--headerline'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)


    # shows and updates the progress bar while mongoimpor
    self.showProgress()


# RECURSIVE FUNCTION
# updates the progress bar every 200ms
def showProgress(self):
    bytes = self.db.command('collStats', self.coll_name.get())
    self.pBar['value'] = bytes['size']

    if bytes['size'] < self.maxbytes:
        self.pBar.after(200, self.showProgress)

1 个答案:

答案 0 :(得分:0)

我认为你不需要多处理方法来处理这种情况。 相反,您只需使用(lldb) po window.debugDescription "Optional(<_UIInteractiveHighlightEffectWindow: 0x106325960; frame = (0 0; 667 375); hidden = YES; gestureRecognizers = <NSArray: 0x1c4444a40>; layer = <UIWindowLayer: 0x1c4235c60>>)" (lldb) po self.window.debugDescription "Optional(<UIWindow: 0x106409840; frame = (0 0; 667 375); autoresize = W+H; gestureRecognizers = <NSArray: 0x1c0054c40>; animations = { position=<CABasicAnimation: 0x1c02323c0>; bounds.origin=<CABasicAnimation: 0x1c0232480>; bounds.size=<CABasicAnimation: 0x1c02324a0>; }; layer = <UIWindowLayer: 0x1c0223a00>>)" 来检查子进程是否已终止。我觉得这样的事情应该有用

Popen.poll