python-3.x - 如何创建多处理套接字服务器?
问题描述
我正在为我正在构建的这个机器人开发一个套接字服务器。我的想法是让多个客户处理某些任务。一名观察员、一名计算器和一名交易员。我希望这些通过创建套接字服务器来相互通信。
我正在为客户端使用多处理,因为有些将使用阻塞代码。我创建了一个简单的服务器函数和一个客户端对象。当我单独运行它们时它们运行良好,但当我从主脚本运行它们时就不行了。如果你们中的任何人都可以看一看,那就太好了!
提前感谢<3
马丁
#server
import socket
class Server:
def __init__(self, host, port, listen):
self.addr = (host, port)
self.listen = listen
def start(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind(self.addr)
self.s.listen(self.listen)
print('Listening..')
def main(self):
self.start()
conn, addr = self.s.accept()
print('Connected with ' + addr[0] + ':' + str(addr[1]))
msg_received = 0
while True:
data = conn.recv(1024)
if not data:
break;
msg_received += 1
print(msg_received)
s.close()
if __name__ == '__main__':
server = Server('localhost',8008, 1)
server.main()
#client
import socket
import time
class Client:
def __init__(self, host, port):
self.addr = (host, port)
def main(self):
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect(self.addr)
print('Connected to host!')
msg = b'koekjes'
while True:
time.sleep(1)
self.s.send(msg)
print('Sent cookies!')
self.s.close()
if __name__ == '__main__':
c = Client('localhost', 8008)
c.main()
#main-script
from multiprocessing import Process
from server import Server
from client import Client
if __name__ == '__main__':
s = Server('localhost', 8007, 1)
c = Client('localhost', 8007)
try:
print('creating process')
Process(target=s.main, daemon=True).start()
Process(target=c.main, daemon=True).start()
except Exception as e:
print('\n' + e + '\n')
c.stop()
s.stop()
解决方案
我可以通过使用以下问题中的示例来弄清楚:ZeroMQ hangs in a python multiprocessing class/object solution
此代码完美运行:
from multiprocessing import Process
import socket
import time
class Base(Process):
"""
Inherit from Process
"""
def __init__(self, host, port):
super().__init__()
self.address = (host, port)
class Server(Base):
def run(self):
print('running server')
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.bind(self.address)
self.s.listen(1)
print('listening..')
conn, addr = self.s.accept()
msg_received = 0
while True:
data = conn.recv(1024)
if not data:
break;
msg_received +=1
print(msg_received)
self.s.close()
class Client(Base):
def run(self):
print('running client')
self.s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.s.connect(self.address)
msg = b'cookies'
while True:
time.sleep(1)
self.s.send(msg)
print('Sent cookies!')
self.s.close()
if __name__ == "__main__":
host = 'localhost'
port = 8008
s = Server(host, port)
c = Client(host, port)
print('both objects created')
s.start()
c.start()
推荐阅读
- typescript - 通过声明文件从 TypeScript 模块中增加 `type`
- javascript - 通过带有字符串对象的数组进行映射并呈现 HTML 标签
- c++ - pybind11:不向下转换为非多态基类
- gpu - 运行 phoronix-test-suite 基准测试时如何选择 GPU?
- c++ - 我的三元“if”表达式有什么问题?
- git - 梦魇试图解决 Xcode 项目上的 git 冲突
- bash - 向嵌套太深的变量添加值
- graph - 流网络可以只有指向 s 而不是向外的箭头吗?
- database - 为实时聚合更新旧数据的最佳做法是什么?
- terraform - Terraform AWS IAM 迭代呈现的 JSON 策略