【问题标题】:Call a method without expecting a response调用方法而不期望响应
【发布时间】:2017-06-07 15:57:53
【问题描述】:

我正在尝试创建一个服务器端应用程序来侦听连接并根据客户端所说的调用方法。但是,当我调用方法上传时,我想继续在 main 下执行代码。

无论如何我可以做到这一点,还是我采取了不正确的方法?代码如下;

def main(ipAddr, tcpPort, bufferSize, s):
    try:
        s.bind((ipAddr, tcpPort))
        s.listen(4)
        conn, addr = s.accept()

    print("Connection attempt from: %s" % addr)
    messageRecv = ""
    while True:
        data = conn.recv(bufferSize)
        if not data: break
        messageRecv = data.decode('utf-8')
finally:
    conn.close()
    if messageRecv == "Ready": upload(addr)

main(ipAddr, tcpPort, bufferSize, s)



def upload(addr):
    pass

【问题讨论】:

  • 我建议阅读多线程编程。你可以看到这个tutorial
  • 请修复缩进。
  • 如果你使用的是最新版本的 Python,你想看看asyncio package。对于旧版本的 Python,请使用 Twisted

标签: python


【解决方案1】:

考虑使用multiprocessing 模块,它本质上是Python 的“多线程”包。 API 与 threading 模块的 API 非常相似,但由于 GILthreading 可能会令人望而却步。

你的情况可能是这样的:

p = Process(target=upload, args=(addr,))
p.start()
# some other code
p.join()

【讨论】:

  • 我支持这个答案,但我始终建议您尝试gevent 一个多线程/多进程范例的轻量级解决方案。如果你对服务器端的 asyncIO 感兴趣,也可以试试Tornado
  • Python 的线程模块非常有用,而网络是线程应用的一个典型例子。 GIL 对许多应用程序来说不是问题,因为大多数应用程序不受 CPU 限制,而是受 I/O 限制。
  • @SvenMarnach 够公平的;我猜这个说法有些苛刻。
  • 一个有用的 SO 线程与使用 Tornado 的示例 - stackoverflow.com/questions/22920877/…
猜你喜欢
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 1970-01-01
  • 2016-10-04
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多