当前位置: 首页 > 面试题库 >

Python加入进程而不会阻止父进程

蒙华翰
2023-03-14
问题内容

我正在编写一个程序,它将监视特定目录中包含下载URL的新文件。一旦检测到新文件,它将在父级继续监视目录的同时创建一个新过程来进行实际下载。我正在使用Process来自的界面multiprocessing。我的问题是,除非我调用process.join(),否则子进程仍在运行,但是process.join()是一个阻止函数,无法实现创建子进程来处理实际下载的目的。

我的问题是,是否有一种以非阻塞方式加入子进程的方法,该方法将允许父进程继续做它的事情?

部分代码:

def main(argv):
  # parse command line args
  ...
  # set up variables
  ...
  watch_dir(watch_dir, download_dir)


def watch_dir(wDir, dDir):
  # Grab the current watch directory listing
  before = dict([(f, None) for f in os.listdir (wDir)])

  # Loop FOREVER
  while 1:
    # sleep for 10 secs
    time.sleep(10)

    # Grab the current dir listing
    after = dict([(f, None) for f in os.listdir (wDir)])

    # Get the list of new files
    added = [f for f in after if not f in before]
    # Get the list of deleted files
    removed = [f for f in before if not f in after]

    if added:
      # We have new files, do your stuff
      print "Added: ", ", ".join(added)

      # Call the new process for downloading
      p = Process(target=child, args=(added, wDir, dDir))
      p.start()
      p.join()

    if removed:
      # tell the user the file was deleted
      print "Removed: ", ", ".join(removed)

    # Set before to the current
    before = after

def child(filename, wDir, dDir):
  # Open filename and extract the url
  ...
  # Download the file and to the dDir directory
  ...
  # Delete filename from the watch directory
  ...
  # exit cleanly
  os._exit(0)

父母等待孩子完成执行,然后再继续执行p.join()(据我所知)是正确的。但这破坏了创造孩子的全部目的。如果我离开了,p.join()那么孩子仍然活跃,并且有一个ps ax | greppython给我’python ‘。

我希望孩子完成自己的工作,然后在不牵扯父母的情况下离开。有办法吗?


问题答案:

您可以设置一个单独的线程来进行连接。让它侦听将子进程句柄推入的队列:

class Joiner(Thread):
    def __init__(self, q):
        self.__q = q
    def run(self):
        while True:
            child = self.__q.get()
            if child == None:
                return
            child.join()

然后,而不是p.join(),执行joinq.put(p)并执行ajoinq.put(None)信号通知线程停止。确保使用FIFO队列。



 类似资料:
  • 问题内容: 我正在尝试使用PyQt为名为“ HandBrake”的视频转换器应用程序构建一个简单的GUI。 我的问题是,当我选择要转换的视频文件时,子进程Popen使用必需的args启动手刹应用程序,但是在等待手刹完成gui时会被阻止,因此我无法进行任何更改。(例如:我不能禁用按钮,也不能更改其文本) 我不是在寻找更复杂的解决方案,例如progressbar等,但是我想在等待程序完成转换的同时简单

  • 我尝试使用C语言中的< code>fork()函数处理Linux中的多个进程,这是我的代码: 现在让我们假设父进程ID为100,两个子进程(p1, p2)ID为101 相反,我看到了一些不同的东西,两个子进程具有相同的PPID,但第一个进程具有与之不同的PID。这是我得到的示例输出: 我的问题是,两个子进程的父PID不应该是3383吗?希望有人能解释这一切在这里是如何运作的,以及我做错了什么(或想

  • 昨天我在python中使用多重处理处理了大约2000万行的日志文件。 启动名为“producer”的进程,逐行读取文件并将其放入队列 代码在下面 结果很奇怪,工作完成后,消费者进程不会终止,并且主函数在连接()处被阻塞。 使用以下不同的套装和代码进行测试: 使用test_get_ip()而不进行多处理来处理大小日志文件,效果很好 那么,有什么问题?列表中有限制吗?有什么我错过的吗? 我的机器环境是

  • 问题内容: 我试图用一个,但不幸的是它似乎并没有工作时。这是一些示例代码: 此代码的输出是: 我希望可以在和被调用时调用,并且输出将类似于(强调)!: 为什么这不起作用,并且当a终止时是否有更好的方法(从上下文)记录消息? 感谢您的输入-非常感谢。 编辑: 根据亚历克斯·马特利(Alex Martelli)建议的解决方案,以下工作可预期进行: 值得在文档中注意以下注释: 注意:当程序被信号杀死,检

  • 问题内容: 强制保持Node.js进程运行的最佳方法是什么,即使其事件循环不为空,从而防止进程终止?我能想到的最好的解决方案是: 如果您将间隔时间保持足够长,它将使间隔运行,而不会引起过多干扰。 有更好的方法吗? 问题的长版 我有一个使用Edge.js来注册回调函数的Node.js脚本,以便可以从.NET中的DLL内部对其进行调用。每秒将调用此功能1次,发送一个应打印到控制台的简单序列号。 Edg

  • 问题内容: 当我运行以下代码时,它停下来让我输入服务器名和它们的端口号,此后应该停下来让我输入用户名,但它永远不会暂停scan.nextline()并直飞输入接收者名称? 问题答案: 代替,我将再次使用,然后解析输入。如果得到,则可以向用户咆哮说输入已被插入。 之所以需要这样做,是因为serverPort输入的末尾还有换行符。使用时,扫描器将获取所有下一个令牌并将其转换为。Integer令牌之后的