Я пишу программу, которая будет смотреть конкретный каталог для новых файлов, содержащих 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()
, тогда ребенок останется активным, а python ps ax | grep
даст мне "python <defunct> ".
Я хочу, чтобы ребенок закончил то, что делал, и ушел, не подняв родителя. Есть ли способ сделать это?