如何在函数receive不发送args的情况下对print "waiting"执行print "waiting"函数?
嗯,我真的不知道怎么做,我想到了join()方法,但我尝试了如下:
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()有时这是可行的,但有时我会陷入无限的循环。
@编辑
现在它工作得很好:
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()有更好的方法吗?
对不起我的英语。
发布于 2017-03-26 10:36:31
我知道这个线程很旧,但是通过OP对self答案进行扩展,我创建了一个类,在运行给定函数时打印一个字符串。
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()使用非常简单:
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下载数据。
https://stackoverflow.com/questions/23067101
复制相似问题