Python присоединяется к процессу без блокировки родителя

Я пишу программу, которая будет следить за определенным каталогом в поисках новых файлов, содержащих 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 | grep python дайте мне 'python '.

Я бы хотел, чтобы ребенок закончил то, что он делает, и ушел, не поддерживая родителя. Есть ли способ сделать это?

21
задан Tarek Fadel 6 March 2011 в 13:50
поделиться