实现此线程的不同方式?

时间:2013-05-13 08:54:32

标签: python multithreading

我在python中尝试线程。我想要一个旋转光标显示,而另一种方法运行(5-10分钟)。我已经完成了一些代码,但我想知道你会怎么做?我不喜欢使用全局变量,所以我假设有更好的方法吗?

c = True 

def b():
    for j in itertools.cycle('/-\|'):
        if (c == True):
            sys.stdout.write(j)
            sys.stdout.flush()
            time.sleep(0.1)
            sys.stdout.write('\b')
        else:
            return

def a():
    global c
    #code does stuff here for 5-10 minutes
    #simulate with sleep
    time.sleep(2)
    c = False

Thread(target = a).start()
Thread(target = b).start()

编辑:

现在的另一个问题是,当处理结束时,旋转光标的最后一个元素仍在屏幕上。所以打印出类似\的内容。

3 个答案:

答案 0 :(得分:3)

你可以使用事件: http://docs.python.org/2/library/threading.html

我测试了这个并且它有效。它还使一切保持同步。您应该避免在不同步的情况下更改/读取相同的变量而不同步它们。

#!/usr/bin/python

from threading import Thread
from threading import Event
import time
import itertools
import sys

def b(event):
    for j in itertools.cycle('/-\|'):
        if not event.is_set():
            sys.stdout.write(j)
            sys.stdout.flush()
            time.sleep(0.1)
            sys.stdout.write('\b')
        else:
            return

def a(event):
    #code does stuff here for 5-10 minutes
    #simulate with sleep
    time.sleep(2)
    event.set()

def main():
    c = Event()
    Thread(target = a, kwargs = {'event': c}).start()
    Thread(target = b, kwargs = {'event': c}).start()

if __name__ == "__main__":
    main()

与'kwargs'相关,来自Python文档(帖子开头的URL):

class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
...
    kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.

答案 1 :(得分:3)

除了全局变量之外,你大部分时间都在正确的轨道上。通常,您需要协调对具有锁或信号量的共享数据的访问,但在这种特殊情况下,您可以采用快捷方式,而只是使用其中一个线程是否正在运行。这就是我的意思:

from threading import Thread
from threading import Event
import time
import itertools
import sys

def monitor_thread(watched_thread):
    chars = itertools.cycle('/-\|')
    while watched_thread.is_alive():
        sys.stdout.write(chars.next())
        sys.stdout.flush()
        time.sleep(0.1)
        sys.stdout.write('\b')

def worker_thread():
    # code does stuff here - simulated with sleep
    time.sleep(2)

if __name__ == "__main__":
    watched_thread = Thread(target=worker_thread)
    watched_thread.start()
    Thread(target=monitor_thread, args=(watched_thread,)).start()

答案 2 :(得分:1)

这未正确同步。但我现在不会试图向你解释这一切,因为它是一大堆知识。请尝试阅读:http://effbot.org/zone/thread-synchronization.htm

但在你的情况下,事情不是同步的纠正并不是那么糟糕。唯一可能发生的事情是旋转条旋转的时间比后台任务实际需要的时间长几毫秒。