2016-07-23 77 views
0

我讀了很多有關線程,排隊,池等文件,但仍然無法弄清楚如何解決我的問題。 情況如下: 我構建了一個由cherrypy提供服務的python3 Django應用程序。該應用程序基本上是另一個IRC客戶端。當我第一次使用GUI運行代碼時,IRC bot通過deamon Thread啓動並監聽事件。我的問題如下:如何向該線程(和我的機器人)發送數據,例如告訴他加入第二個頻道?當我第二次運行代碼時,顯然會創建一個新的機器人實例以及一個新的服務器連接。我需要一種通過GUI交互與我的機器人通信的方式。現在,我必須讓我的機器人對特定事情做出反應的唯一方式是通過閱讀數據庫。其他一些GUI操作會改變該數據庫。這是一個糟糕的系統。Python3網絡服務器之間的通信IRC的機器人線程

這是啓動我的機器人的相關代碼。

def DCC_deamonthread(c, server, nickname, upload): 
    try: 
     c.connect(server, 6667, nickname) 
     c.start() 
    except irc.client.ServerConnectionError as x: 
     log("error" + str(x)).write() 
     upload.status, upload.active = "Error during connection", False 
     upload.save() 

def upload_file(filename, rec_nick, pw): 
    global upload 
    Upload_Ongoing.objects.all().delete() 
    upload = Upload_Ongoing(filename=filename,status="Connecting to server...", active=True) 
    upload.save() 
    irc.client.ServerConnection.buffer_class.encoding = 'latin-1' 
    c = DCCSend(filename, rec_nick, pw) 
    server = "irc.rizon.net" 
    nickname = ''.join(random.choice(string.ascii_lowercase) for i in range(10)) 
    t = threading.Thread(target=DCC_deamonthread, args=(c, server, nickname, upload)) 
    t.daemon=True 
    t.start() 

回答

1

問題是,正如您注意到的那樣,您每次上傳時都會生成一個新的線程/機器人。一個可能的解決方案是重寫你的代碼來做這樣的事情:

event_queue = multiprocessing.Queue() # Events that will be sent to the IRC bot thread 

def irc_bot_thread(): 
    bot = connect_to_irc() 

    for event in event_queue: 
     bot.handle_event(event) 

threading.Thread(target=irc_bot_thread).start() 

def upload_file(filename, rec_nick, pw): 
    # Django stuff 

    event_queue.push(<necessary data for use by the bot>) 
+0

event_queue會不會被新的執行覆蓋? – mrj

+0

那麼一個新的event_queue肯定是創建的。但事實上,通過讓我的機器人在一個循環中讀取event_queue,然後在另一個線程中導入event_queue,我設法通過GUI將數據正確地發送到第一個機器人。這是我正在尋找的。有另一種可能的方法嗎? (只要我設法完全實施解決方案,我會立即進行驗證)。 – mrj

+0

另外,有沒有一種有效的方式來讀取隊列項目而不刪除項目?是否有另一個允許數據持久性的類似對象? – mrj