首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >实现这种线程化的不同方式?

实现这种线程化的不同方式?
EN

Stack Overflow用户
提问于 2013-05-13 16:54:32
回答 3查看 151关注 0票数 4

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

代码语言:javascript
运行
复制
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()

编辑:

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

EN

回答 3

Stack Overflow用户

发布于 2013-05-13 17:14:24

您可以使用events:http://docs.python.org/2/library/threading.html

我对此进行了测试,它可以正常工作。它还可以使所有内容保持同步。您应该避免在不同步的情况下更改/读取不同线程中的相同变量。

代码语言:javascript
运行
复制
#!/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):

代码语言:javascript
运行
复制
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})
...
    kwargs is a dictionary of keyword arguments for the target invocation. Defaults to {}.
票数 3
EN

Stack Overflow用户

发布于 2013-05-13 18:40:47

除了全局变量之外,您在大多数情况下都是正确的。通常情况下,您需要使用锁或信号量来协调对共享数据的访问,但在这种特殊情况下,您可以走捷径,只使用其中一个线程是否正在运行。这就是我的意思:

代码语言:javascript
运行
复制
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()
票数 3
EN

Stack Overflow用户

发布于 2013-05-13 17:09:15

这没有正确同步。但我现在不会试图向你解释所有这些,因为这是一大堆知识。试着读一下这个:http://effbot.org/zone/thread-synchronization.htm

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16518142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档