如何创建两个脚本使用的共享生成器

时间:2014-06-05 16:16:57

标签: python module

我的目标是让两个脚本使用来自其中一个脚本的相同生成器,这类似下面的无效代码:

# 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;?

另外,只是想清楚,我知道这个想法可能是一个不好的做法,但我只是想知道为了知道。

1 个答案:

答案 0 :(得分:0)

使用threadingjoin可以获得您想要的效果。

以下代码启动一个线程,将其设置为运行,然后等待(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