<p>插座也是解决这个问题的好方法。<br/>
基本上,与其让一个程序带有线程或多个进程,不如让一个外部程序执行您从外部连接到的异步程序。你知道吗</p>
<p>在<a href="https://pymotw.com/2/socket/tcp.html" rel="nofollow noreferrer">PMOTW</a>了解有关套接字的更多信息</p>
<p>下面是一个非常完整的示例(Python2.7):</p>
<pre><code>import argparse
import logging
import socket
import time
import random
description = """
This program sends data across a socket
"""
arg_parser = argparse.ArgumentParser(description=description)
arg_parser.add_argument(' AgentIP', '-i', action='store'
, default='localhost' , type=str
, help="The IP address of this Server that client will connect to."
)
arg_parser.add_argument(' AgentPort', '-p', action='store'
, default='13000' , type=int
, help="The port number of the socket that client will connect to."
)
arg_parser.add_argument(' log', action='store'
, default='INFO' , type=str
, help="Log level"
, choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
)
args = arg_parser.parse_args()
# use Logger for great justice and heavenly output
logging.basicConfig(level=getattr(logging, args.log, 'CRITICAL'))
log = logging.getLogger(name='SERVER')
### vvv YOUR CODE vvv ###
def asyncgen(log):
for i in range(5):
log.debug("I want this part to work asynchronously :(")
time.sleep(random.random())
yield "Hi"
### ^^^ YOUR CODE ^^^ ###
def make_a_connection(server, log):
# Accept outside connections
(client_socket, address) = server.accept()
log.info("Got a connection : {}:{}".format(client_socket,address))
for value in asyncgen(log):
client_socket.send(value)
log.info("SEND:{}".format(value))
client_socket.close()
def main(args, log):
server = socket.socket( socket.AF_INET , socket.SOCK_STREAM )
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
hostname = socket.gethostbyname(args.AgentIP)
port = args.AgentPort
address = (hostname, port)
server.bind(address)
server.listen(1)
log.info("Server started on {}:{}".format(hostname, port))
try:
while True:
make_a_connection(server, log)
except (KeyboardInterrupt, SystemExit):
server.close()
log.info("Server connections closed")
if __name__=='__main__':
main(args, log)
</code></pre>