当前位置: 主页 > 日志 > Python >

多线程中生成器(generator)出现"generator already executing"问题的解决

 generators can be shared between threads, but they cannot be resumed from two threads at the same time.

当两个线程同时调用一个生成器的next方法时就会引发“generator already executing”异常。

解决方法:加锁。

如下代码所示:

import threading

class threadsafe_generator:
    """Takes an generator and makes it thread-safe by
    serializing call to the `next` method of given generator.
    """
    def __init__(self, gen):
        self.gen = gen
        self.lock = threading.Lock()

    def __iter__(self):
        return self.next()

    def next(self):
        with self.lock:
            return self.gen.next()


# 定义我们的生成器
def all_keywords():
    for row in csv.reader(open('companies.csv')):
        if row[0]:
           yield row[0]


# 将其转换为线程安全的
keywords = threadsafe_generator(all_keywords())
# 然后在线程中就可以随意地使用keywords.next()而不必担心"generator already executing"异常了。

 

[日志信息]

该日志于 2012-06-19 12:25 由 redice 发表在 redice's Blog ,你除了可以发表评论外,还可以转载 “多线程中生成器(generator)出现"generator already executing"问题的解决” 日志到你的网站或博客,但是请保留源地址及作者信息,谢谢!!    (尊重他人劳动,你我共同努力)
   
验证(必填):   点击我更换验证码

redice's Blog  is powered by DedeCms |  Theme by Monkeii.Lee |  网站地图 |  本服务器由西安鲲之鹏网络信息技术有限公司友情提供

返回顶部