在Python中循环运行单独的函数

时间:2014-09-08 08:51:07

标签: python multithreading raspberry-pi

我正在尝试使用Raspberry PI在LED标志上显示RSS数据。我的代码基于我第一次购买时为标志找到的脚本。它是一个简单的脚本,允许您向标志发送消息和颜色,它将滚动直到键盘中断。

sudo python scroll "Hello World" 1 #red
sudo python scroll "Hello World" 2 #green
sudo python scroll "Hello World" 3 #red and green (orange)

这个脚本和我正在处理的脚本之间的区别在于所有数据都是在循环之前处理的,然后showmatrix()函数用于在屏幕上显示字符串和shiftmatrix()函数用于滚动图像。

为了不断下载RSS数据,我将以下代码放在循环中:

#grab emails
newmails = int(feedparser.parse("https://" + USERNAME + ":" + PASSWORD +"@mail.google.com/gmail/feed/atom")["feed"]["fullcount"])

textinput =  "You have " + str(newmails) + " new emails"

# append extra characters to text input to allow for wrap-around
textinput+="  ::  "

然后我使用与之前相同的功能在标志上显示这些数据:

# Continually output to the display until Ctrl-C
    #

# loop around each column in the dotarray
for col in range(len(dotarray[0])):
    for row in range(8):
        # copy the current dotarray column values to the first column in the matrix
        matrix[row][0]=(dotarray[row][col])
    # now that we have updated the matrix lets show it
    showmatrix()
    # shift the matrix left ready for the next column
    shiftmatrix()

由于RSS数据下载需要很长时间(最后一秒),输出循环不会运行那段时间,并且符号变为空白。有没有办法同时运行feedparser功能,所以没有延迟?

我认为多线程是前进的方向吗?我看了一下couroutines,但那让我无处可去。

1 个答案:

答案 0 :(得分:0)

是的,os.fork(),你可以让函数在不同的进程或线程模块中运行,使其在另一个线程中运行。 如果函数使用全局变量,则需要使用线程模块并使其在另一个线程中运行,如果不是,我建议无论如何都要这样做,浪费更少的资源(假设函数没有分配很多内存或以其他方式使用很多资源),你的代码应该是这样的:

class displayThread(threading.Thread)
    *init function if you need to pass info to the tread, otherwise dont write one but if you do
     make sure to call Thread.__init__() first in your function*
    def run():  //Overrides the run function
        *display what you want on the display*

class downloadThread(threading.Thread)
    *init function if you need to pass info to the tread, otherwise dont write one but if you do
     make sure to call Thread.__init__() first in your function*
    def run():  //Overrides the run function
        *download what you want*

并且您的主脚本应如下所示:

thread1 = displayThread
thread2 = downloadThread
thread1.start()
thread2.start()
thread2.join()   //waits for download to finish while the display in being updated by the other thread

如果你想停止显示线程(假设它永远存在),你将不得不添加如下内容:

os.kill(thread1.getpid(), signal.SIGKILL)
<。>在.join()之后,用下载的信息做你想做的事。

多进程版本非常相似,您应该能够理解如何从我的示例和os.fork()文档中获取它,如果您遇到问题 - 让我知道并且我会编辑这个。