我的目标是让两个脚本使用来自其中一个脚本的相同生成器,这类似下面的无效代码:
# scriptA.py
def generator():
num = 0
while True:
yield(num)
num += 1
my_generator = generator()
if __name__ == '__main__':
# start scriptB in a thread,
# print ouput from scriptB
# wait until scriptB is finished
a = 0
while a <= 5:
print('script A: {}'.format(my_generator.next()))
a += 1
# scriptB.py (a separate file)
from scriptA import my_generator
if __name__ == '__main__':
a = 0
while a <= 5:
print('script B: {}'.format(my_generator.next()))
a += 1
上述代码的输出符合预期
script B: 1
script B: 2
script B: 3
script B: 4
script B: 5
script A: 1
script A: 2
script A: 3
script A: 4
script A: 5
但是,我希望输出像
script B: 1
script B: 2
script B: 3
script B: 4
script B: 5
script A: 6
script A: 7
script A: 8
script A: 9
script A: 10
我了解当我从scriptA导入my_generator
时,它会在scriptB中创建一个新的my_generator
。
所以我的问题是,是否有可能获得第二个输出而不必将my_generator.next()
的值从scriptA传递到scriptB,同时保持scriptA&#39; main <的主要结构< /强>&#39;?
另外,只是想清楚,我知道这个想法可能是一个不好的做法,但我只是想知道为了知道。
答案 0 :(得分:0)
使用threading
和join
可以获得您想要的效果。
以下代码启动一个线程,将其设置为运行,然后等待(joins
)。然后继续使用主代码。
请注意threading
是低级别的,并且没有那么多功能。如果可能,我建议使用gevent。如果您想坚持使用标准Python库,请使用multiprocessing
,特别是Pool.async
函数。对于高性能的东西,使用Python3的asyncio
库。
import threading
def generator():
num = 0
while True:
yield(num)
num += 1
def scriptb(gen):
a = 0
while a <= 5:
print('script B: {}'.format(gen.next()))
a += 1
my_generator = generator()
if __name__ == '__main__':
# start scriptB in a thread,
# print ouput from scriptB
# wait until scriptB is finished
t = threading.Thread(target=scriptb, args=[my_generator])
t.start()
t.join()
a = 0
while a <= 5:
print('script A: {}'.format(my_generator.next()))
a += 1
script B: 0
script B: 1
script B: 2
script B: 3
script B: 4
script B: 5
script A: 6
script A: 7
script A: 8
script A: 9
script A: 10
script A: 11