Python,一个线程可以生成另一个线程吗

1 投票
1 回答
568 浏览
提问于 2025-04-16 05:18

我正在用Python 2.x写一个更新应用程序。我有一个线程(叫做ticket_server)在一个数据库(CouchDB)的地址上以长轮询模式运行。更新请求是从外部应用程序发送到这个数据库的。当有变化发生时,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)

这段代码只是想问哪种方法更安全、更高效、更符合Python的风格。我才学了几个月Python,所以这些问题让我脑袋有点转不过来。

1 个回答

3

程序的主线程就是一个线程;要创建一个新线程,必须从另一个线程中去做。

当然,你需要确保你的阻塞线程在等待的时候释放全局解释器锁(GIL),否则其他的Python线程就无法运行。所有成熟的Python数据库连接库都会做到这一点,但我从来没有听说过couchdb会这样做。

撰写回答