Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用';永不放弃';过程_Python_Multithreading_Irc_Gevent Socketio - Fatal编程技术网

Python 如何使用';永不放弃';过程

Python 如何使用';永不放弃';过程,python,multithreading,irc,gevent-socketio,Python,Multithreading,Irc,Gevent Socketio,我正在尝试将irc客户端添加到我正在开发的django web应用程序中。我希望irc通信的服务器端代码使用python并通过套接字库进行连接。然后,我将使用gevent socketio在浏览器中从irc通道向客户端发送和接收数据。到目前为止,我有一个非常基本的gevent socketio服务器和客户机,可用于在多个客户机之间进行实时广播,但是,当我开始将客户机连接到IRC时,他们使用客户机传递的尼克成功连接到IRC服务器,但这似乎是正在进行的keepalive/侦听过程正在阻止be从客户端

我正在尝试将irc客户端添加到我正在开发的django web应用程序中。我希望irc通信的服务器端代码使用python并通过套接字库进行连接。然后,我将使用gevent socketio在浏览器中从irc通道向客户端发送和接收数据。到目前为止,我有一个非常基本的gevent socketio服务器和客户机,可用于在多个客户机之间进行实时广播,但是,当我开始将客户机连接到IRC时,他们使用客户机传递的尼克成功连接到IRC服务器,但这似乎是正在进行的keepalive/侦听过程正在阻止be从客户端发送任何消息

Python IRC代码

import socket

class pycli:
    def __init__(self,user):
        self.nick = user
        self.chan = "#testchannel"
        self.owner = "Bluebot"
        self.sock = socket.socket()
        print "irc conn"

    def send_msg(self,message):
        self.sock.send("PRIVMSG " + self.chan + " : " + message + "\r\n")
    ## misc setup
    def keep_alive(self):
        self.sock.connect(("irc.freenode.net",6667))
        self.sock.send("USER " + self.nick + " 0 * :" + self.owner + "\r\n")
        self.sock.send("NICK " + self.nick + "\r\n")
        while 1:
            ## keep checking for data
            data = self.sock.recv(512)
            datalen = len(data.split(" "))
            sender = ""
            msg_type = ""
            msg_rcpt = ""
            message = ""

        ###----------------------------------------------
        ## reply to keep alive pings
            if data[0:4] == "PING":
                self.sock.send(data.replace("PING", "PONG"))
            if data[0]!=':':
                continue
            if data.split(" ")[1] == "001":
                self.sock.send("MODE " + self.nick + " +B\r\n")
                self.sock.send("JOIN " + self.chan + "\r\n")

        ###-----------------------------------------------
        ##split and assign data parts

        ## parse out the actual sender
            send_data = data.split(" ")[0]
            send_data = send_data[1:]
            sender = send_data.split('!')[0]

        ## mode
            msg_type = data.split(" ")[1]

        ## if it exists get the recipient (room or private)
            if datalen > 2:
                msg_rcpt = data.split(" ")[2]

        ## get the actual message body  
            if datalen > 3:
                message = (" ".join(data.split(" ")[3:])).lower()[1:]
            print data
我知道这个功能是超基本的,但是一旦我通过客户端使它工作,我就可以扩展它

我的服务器代码的相关部分基本上如下所示:

def on_login(self, nick):
    if self.nick:
        self._broadcast('exit', self.nick)
        self.nick = nick
        self._broadcast('enter', nick)
        self.emit('users',
              [ ns.nick
                for ns in self._registry.values()
                if ns.nick is not None ])
        t = threading.Thread(target=self.make_start_irc(nick),daemon=True)
        t.start()

def on_chat(self, message):
    if self.nick:
        self._broadcast('chat', dict(u=self.nick, m=message)) 
        self._irc_nicks[self.nick].send_msg("this is a test")
    else:
        self.emit('chat', dict(u='SYSTEM', m='You must first login'))

def make_start_irc(self,nick):
    if nick not in self._irc_nicks.values():
        self._irc_nicks[nick] = pycli.pycli(nick)
        print self._irc_nicks
        self._irc_nicks[nick].keep_alive()

def _broadcast(self, event, message):
    for s in self._registry.values():
        s.emit(event, message)

def chat(environ, start_response):
if environ['PATH_INFO'].startswith('/socket.io'):
    return socketio_manage(environ, { '/chat': ChatNamespace })
else:
    return serve_file(environ, start_response)

def serve_file(environ, start_response):
    path = os.path.normpath(
        os.path.join(public, environ['PATH_INFO'].lstrip('/')))
    assert path.startswith(public), path
    if os.path.exists(path):
        start_response('200 OK', [('Content-Type', 'text/html')])
        with open(path) as fp:
            while True:
                chunk = fp.read(4096)
                if not chunk: break
                yield chunk
    else:
        start_response('404 NOT FOUND', [])
        yield 'File not found'


if __name__ == "__main__":
    from gevent import monkey
    monkey.patch_all()
    sio_server = SocketIOServer(
    ('', 8080), chat, 
    policy_server=False)
    t2 = threading.Thread(target=sio_server.serve_forever())
    t2.start()
当我最终放弃并使用ctrl-C时,我看到了下面的stacktrace,这让我相信我的线程方式是阻塞的

Traceback (most recent call last):
  File "socketio_test.py", line 92, in <module>
    t2 = threading.Thread(target=sio_server.serve_forever())
  File "/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site-packages/gevent/baseserver.py", line 284, in serve_forever
    self._stop_event.wait()
  File "/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site-packages/gevent/event.py", line 77, in wait
    result = self.hub.switch()
  File "/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site-packages/gevent/hub.py", line 338, in switch
    return greenlet.switch(self)
KeyboardInterrupt
回溯(最近一次呼叫最后一次):
文件“socketio_test.py”,第92行,在
t2=threading.Thread(target=sio\u server.serve\u forever())
文件“/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site-packages/gevent/baseserver.py”,第284行,永远服务
self.\u停止\u事件。等待()
文件“/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site packages/gevent/event.py”,第77行,等待中
结果=self.hub.switch()
文件“/Users/andrewscott/Desktop/wham/pycli/wham/lib/python2.7/site packages/gevent/hub.py”,第338行,在交换机中
返回绿色小开关(自)
键盘中断

如果有人知道我如何将irc进程更改为非阻塞,或者有任何一般性建议,他们将不胜感激。

您应该删除此呼叫:

t2 = threading.Thread(target=sio_server.serve_forever())
t2 = threading.Thread(target=sio_server.serve_forever)
并正确通过以下方法:


您应该删除该呼叫:

t2 = threading.Thread(target=sio_server.serve_forever())
t2 = threading.Thread(target=sio_server.serve_forever)
并正确通过以下方法: