【发布时间】:2019-12-11 20:10:14
【问题描述】:
我有以下代码来复用阻塞生成器:
import datetime
import time
import queue
import threading
def blocking1():
while True:
time.sleep(1)
result = "Block1: {}".format(datetime.datetime.now())
yield result
def blocking2():
while True:
time.sleep(2)
result = "Block2: {}".format(datetime.datetime.now())
yield result
def multiplex(generators):
if len(generators) == 1:
return generators[0]
elif len(generators) > 1:
q = queue.Queue()
def run_one(src):
for e in src: q.put(e)
def run_all():
threads = []
for src in generators:
t = threading.Thread(target=run_one, args=(src,))
t.start()
threads.append(t)
for t in threads: t.join()
q.put(StopIteration)
threading.Thread(target=run_all).start()
while True:
e = q.get()
if e is StopIteration:
return
yield e
else:
return []
if __name__ == "__main__":
# tasks = [("map1: {}".format(e) for e in blocking1()), ("map2: {}".format(e) for e in blocking2())]
tasks = [("map1: {}".format(e) for e in blocking1())]
for e in multiplex(tasks):
print(e)
我想聪明点,万一只有一个生成器,不要进行任何线程生成。只需返回这个单一的生成器(在所有类型仍然匹配之后)
但它不是那样工作的。
程序立即终止(就像这是一个空生成器)
有趣的是以下工作(显示map1... 输出):
import datetime
import time
import queue
import threading
def blocking1():
while True:
time.sleep(1)
result = "Block1: {}".format(datetime.datetime.now())
yield result
def blocking2():
while True:
time.sleep(2)
result = "Block2: {}".format(datetime.datetime.now())
yield result
def multiplex(generators):
if len(generators) == 1:
return generators[0]
else:
return []
if __name__ == "__main__":
# tasks = [("map1: {}".format(e) for e in blocking1()), ("map2: {}".format(e) for e in blocking2())]
tasks = [("map1: {}".format(e) for e in blocking1())]
for e in multiplex(tasks):
print(e)
区别仅在于删除elif 部分...
有人可以帮我理解发生了什么吗? 我正在使用 Python 3.5.3
【问题讨论】:
-
你能在你的函数中打印
len(generators)吗? -
是
1,为什么要不一样?
标签: python python-3.x generator