首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >函数打印“等待”,同时等待另一个函数的值。

函数打印“等待”,同时等待另一个函数的值。
EN

Stack Overflow用户
提问于 2014-04-14 18:08:19
回答 1查看 95关注 0票数 0

如何在函数receive不发送args的情况下对print "waiting"执行print "waiting"函数?

嗯,我真的不知道怎么做,我想到了join()方法,但我尝试了如下:

代码语言:javascript
运行
复制
import threading
import random

waiting = True

def receive(a=""):
    while waiting:
        print "[receive] waiting for args"
    print "[receive] Args received: %s" % a # args received from send function

def send(args):
    global waiting
    if waiting:
        if random.randint(1,3) == 2:
            waiting = False
            print "[send] Args sent"
            receive(a=args) # send the args

fargs = ["hello, world", "foo", "bar", "foobar", 12]

t1 = threading.Thread(target=receive, args=[])
t2 = threading.Thread(target=send, args=[fargs])

t1.start()
t2.start()

有时这是可行的,但有时我会陷入无限的循环。

@编辑

现在它工作得很好:

代码语言:javascript
运行
复制
import threading
import random

waiting = True

def receive(a=""):
    while waiting:
        print "[receive] waiting for args"
    if a:
        print "[receive] Args received: %s" % a
def send(args):
    global waiting
    while waiting:
        if random.randint(1,3) == 2:
            waiting = False
            print "[send] Args sent"
            receive(a=args)

fargs = ["hello, world", "foo", "bar", "foobar", 12]

t1 = threading.Thread(target=receive, args=[])
t2 = threading.Thread(target=send, args=[fargs])


t1.start()
t2.start()

有更好的方法吗?

对不起我的英语。

EN

回答 1

Stack Overflow用户

发布于 2017-03-26 10:36:31

我知道这个线程很旧,但是通过OP对self答案进行扩展,我创建了一个类,在运行给定函数时打印一个字符串。

代码语言:javascript
运行
复制
import threading
import queue
import time
import getpass

class DotsPrinter:
   def __init__(self, float_dots_frequency=1, 
                string_to_print_while_waiting="."):
    self.float_dots_frequency = float_dots_frequency
    self.string_to_print_while_waiting = string_to_print_while_waiting
    self.bool_waiting = True
    self.output_queue = queue.Queue()

    def print_dots(self):
        if self.bool_waiting:
            print("Waiting ", end="", flush=True)
        while self.bool_waiting:
            print(self.string_to_print_while_waiting, end="", 
                  flush=True)
            time.sleep(self.float_dots_frequency)

    def function_wrapper(self, function, *args, **kwargs):
        self.output_queue.put(function(*args, **kwargs))
        self.bool_waiting = False

    def print_dots_while_executing(self, function, *args, **kwargs):

        t1 = threading.Thread(target=self.print_dots)
        t2 = threading.Thread(target=self.function_wrapper, args=
                              [function, *args], kwargs={**kwargs})
        t1.start()
        t2.start()
        return self.output_queue.get()

使用非常简单:

代码语言:javascript
运行
复制
def count_till_timeout(timeout):
    start_time = time.time()
    n = 0
    while time.time() - start_time < timeout:
        n += 1
    return n

n = DotsPrinter().print_dots_while_executing(count_till_timeout, 5)
print(n)

我没有对它进行外部测试,所以它可能有一些but,而且我也不是线程方面的专家,因此我不知道是否应该这样做,但我希望它能帮助到别人。我用它打印点,而熊猫从sql DB下载数据。

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

https://stackoverflow.com/questions/23067101

复制
相关文章

相似问题

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