python - Python 网络线程
问题描述
好的,我想用 python 编写服务器。因此我打开了一个套接字并等待输入。当我得到一个输入时,我得到一个进一步的套接字和地址。
因为我想同时实现多个连接,所以我研究了 python 中的多线程。
我通过以下方式创建一个线程:
t = Thread(target=input, args=(conn, address, ))
t.start()
我的输入法如下所示:
def input(conn, address): [...]
现在,如果以这种方式我得到以下堆栈跟踪:
线程 Thread-1 中的异常:
回溯(最后一次调用):文件“/usr/lib/python3.8/threading.py”,第 932 行,在 _bootstrap_inner self.run()
文件“/usr/lib/python3.8/threading.py”,第 870 行,运行 self._target(*self._args, **self._kwargs)
TypeError:最多输入 1 个参数,得到 2 个
如果我删除地址(并且只给出 conn),它会打印以下内容:
<socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('10.0.0.9', 3306), raddr=('10.0.0.9', 32908)>
我该怎么理解?
问题解决:我需要通过self.input调用方法而不是input。
解决方案
input 是一个内置的 python 函数,它有一个参数,所以当你试图在线程 python 中使用 input 时,假设你想使用内置的 input 函数。更改函数名称将解决问题:
def _input(conn, address): [...]
t = Thread(target=_input, args=(conn, address, ))
t.start()
PS:这种方式不是处理多线程网络的好方法
推荐阅读
- macos - OS X 菜单背景颜色
- jenkins - 插件 [id: 'org.sonarqube', version: '2.6.2'] 未找到
- php - 有没有办法在 PHP 中获取 HTTP 状态代码的文本表示?
- c++ - 具有默认参数的函数对象的 SFINAE
- docker - WLST 数据源和未知主机
- javascript - 带有列表组的 Bootstrap 4 scrollspy 不起作用
- c# - WPF ReactiveUI ReactiveCommand 对动作的反应如此之长
- java - phantomjs 没有为可执行文件路径设置正确的 DesiredCapabilities
- android - 为什么我的 PhoneGap 应用在 Android 设备上启动缓慢?
- django - Ajax 转到 url 而不是更改数据 Django