循环不适用于多处理和睡眠

时间:2015-08-28 14:20:22

标签: python while-loop raspberry-pi multiprocessing

我知道这个问题已经被问到了。但我无法回答这种魅力......

所以我有一个执行while循环的进程。但它不会循环。它转了一圈又......我不知道。这是我的循环:

import os
import time
import signal
import getdata
import twitter
import multiprocessing

collector = getdata.collectData(0)  # Pour récupérer les données
botter = twitter.twitter()  # Pour tweeter


def data_update_loop():
    while True:
        print 'Tour de boucle!'
        start = time.time()  # On calcule le temps d'éxecution

        global collector, botter

        collector.write_data()
        botter.hourly_message()

        done = time.time()  # On stope le chrono

        # On s'assure que le programme attende bien une demie-heure
        time.sleep(1800 - (done - start))

def abort():
    f = open('RUNNING.txt', 'r')
    process = f.readline()
    process = filter(None, process.split(","))

    try:
        for p in process:
            os.kill(int(p), signal.SIGQUIT)
    finally:
        f.close()
        os.remove('RUNNING.txt')


def main():
    if not os.path.isfile('RUNNING.txt'):
        f = open('RUNNING.txt', 'w+')

        data_update = multiprocessing.Process(target=data_update_loop)

        data_update.start()

        # On écrit les PIDs pour pouvoir fermer les process après
        f.write('{},{}'.format(data_update.pid, mentions_update.pid))
        f.close()

        choice = raw_input('Press X to abort all processes: ')
        if choice.upper() == 'X':
            abort()

    else:
        print 'Please restart the programm.'
        os.remove('RUNNING.txt')



if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        abort()
你能解释一下为什么吗?我知道这是关于CPU的事情......
谢谢你的回答!

2 个答案:

答案 0 :(得分:2)

我没有深入分析你的节目,但原因是主要过程并不等待孩子完成。

答案 1 :(得分:0)

感谢您的回答,我认为它有效,但不,它仍然无法正常工作...

#!/usr/bin/env python
# coding: utf-8

import os
import time
import signal
import getdata
import twitter
import multiprocessing

collector = getdata.collectData(0)  # Pour récupérer les données
botter = twitter.twitter()  # Pour tweeter


def data_update_loop():
    while True:
        start = time.time()  # On calcule le temps d'éxecution

        global collector, botter

        collector.write_data()
        botter.hourly_message()

        done = time.time()  # On stope le chrono

        # On s'assure que le programme attende bien une demie-heure
        time.sleep(1800 - (done - start))


def mentions_update_loop():
    global botter
    botter.mentions()


def abort():
    f = open('RUNNING.txt', 'r')
    process = f.readline()
    process = filter(None, process.split(","))

    try:
        for p in process:
            os.kill(int(p), signal.SIGQUIT)
    finally:
        f.close()
        os.remove('RUNNING.txt')


def main():
    if not os.path.isfile('RUNNING.txt'):
        print 'Press ctrl + c to abort all processes.'

        f = open('RUNNING.txt', 'w+')

        data_update = multiprocessing.Process(target=data_update_loop)
        mentions_update = multiprocessing.Process(target=mentions_update_loop)

        data_update.start()
        mentions_update.start()

        # On écrit les PIDs pour pouvoir fermer les process après
        f.write('{},{}'.format(data_update.pid, mentions_update.pid))
        f.close()

    else:
        print 'Please restart the programm.'
        os.remove('RUNNING.txt')



if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        abort()

正如你所说,我更新了我的main()函数,并且在启动进程后它没有做任何事情...

感谢您的帮助!