【问题标题】:Python, is it proper for one thread to spawn anotherPython,一个线程产生另一个线程是否合适
【发布时间】:2010-10-10 23:49:36
【问题描述】:

我正在用 Python 2.x 编写一个更新应用程序。我有一个线程(ticket_server)以长轮询模式坐在数据库(CouchDB)url 上。更新请求从外部应用程序转储到此数据库中。当发生变化时,ticket_server 会触发一个工作线程(update_manager)。繁重的工作在这个 update_manager 线程中完成。将执行 telnet 连接和 ftp 上传。所以最重要的是不要中断这个过程。

我的问题是,从 ticket_server 线程中生成 update_manager 线程是否安全?

另一种选择可能是将请求放入队列,并让另一个函数等待票证进入队列,然后将请求传递给 update_manager 线程。但是,我宁愿保持简单(我假设 ticket_server 产生 update_manager 很简单),直到我有理由扩展。

# Here is the heavy lifter
class Update_Manager(threading.Thread):
    def __init__(self)
        threading.Thread.__init__(self, ticket, telnet_ip, ftp_ip)
        self.ticket = ticket   
        self.telnet_ip = telnet_ip
        self.ftp_ip = ftp_ip


    def run(self):
        # This will be a very lengthy process.
        self.do_some_telnet()
        self.do_some_ftp()

    def do_some_telnet(self)
        ...

    def do_some_ftp(self)
        ...

# This guy just passes work orders off to Update_Manager
class Ticket_Server(threading.Thread):
    def __init__(self)
        threading.Thread.__init__(self, database_ip)
        self.database_ip

    def run(self):
        # This function call will block this thread only.
        ticket = self.get_ticket(database_ip)

        # Here is where I question what to do.
        # Should I 1) call the Update thread right from here...
        up_man = Update_Manager(ticket)
        up_man.start

        # Or should I 2) put the ticket into a queue and let some other function
        # not in this thread fire the Update_Manager. 


    def get_ticket()
    # This function will 'wait' for a ticket to get posted. 
    # for those familiar with couchdb:
        url = 'http://' + database_ip:port + '/_changes?feed=longpoll&since=' + update_seq
        response = urllib2.urlopen(url)

这只是询问哪种方法更安全/更有效/更pythonic的大量代码 我只有几个月的时间使用 python,所以这些问题让我的大脑陷入了一段时间的循环。

【问题讨论】:

    标签: python multithreading


    【解决方案1】:

    程序的主线程线程;产生线程的唯一方法是从另一个线程。

    当然,您需要确保您的阻塞线程在等待时释放 GIL,否则其他 Python 线程将无法运行。所有成熟的 Python 数据库绑定都会这样做,但我从未听说过 couchdb。

    【讨论】:

    • couchdb 是那些新奇的“面向对象数据库”之一。
    • @Arafangion,也许我们应该在误导那些没有听说过 couchdb 的人之前检查“它不是什么”couchdb.apache.org/docs/intro.html>。
    • @Glenn,我应该举几个例子来更好地说明我的问题。
    • @sbartell:注意点——也许我的术语很不准确,但是,我觉得这里的意思是一样的。请注意,我没有具体说明我们正在谈论的面向对象的 /type/ 类型,但在我看来,它似乎非常适合基于原型的面向对象语言系统。
    • @Glenn,主程序是一个线程,明白了。我以前没有建立过这种联系。因此,在这个“主线程”中,我将启动另一个线程,即在 url 上等待更改的ticket_server(这取决于连接是否保持活动状态)。从该线程内部触发 Update_Manager 线程是否安全?或者,将它们传递到队列中并让另一个方法/线程(不依赖于 thread_server 保持连接)将票证传递给 Update_manager 线程是更被接受的方法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    相关资源
    最近更新 更多