python - 如何使多个套接字 DDE 和 RTD 请求更快
问题描述
所以,基本上我有一个 python 程序,我需要截取 137 个提供 excel 文件的 DDE 和 RTD 信号。我通过使用带有以下代码的套接字来做到这一点:
import socket
import win32api
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 12002))
s.sendall(str.encode('COT$S|' + stock + '#'))
data = s.recv(32768)
但是,当我运行 137 次时,需要 27 秒才能完成,但我需要 5 到 10 秒之间的时间。所以,我尝试使用多处理,但是,它开始占用我计算机的无限内存,直到它崩溃。我可以做些什么来优化这段代码吗?谢谢!
解决方案
我的建议是使用multiprocessing.Pool
. 手头有一些时间,我做了一些模拟测试,这很有效。调整以适应您的需求。
事实上,它将使用一个由 5 个工作人员组成的池来循环遍历stocks
列表中的每个项目,因此应该检查内存消耗,但执行速度应该非常快。当然,您可以调整池大小。
import socket
import win32api
from multiprocessing import Pool
stocks = ['AA', 'BB', 'CC', 'DD', 'EE'] # just a sample list
def network_op(stock):
print('Running ' + stock)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 12002))
s.sendall(str.encode('COT$S|' + stock + '#'))
d = s.recv(32768)
return d
if __name__ == '__main__':
with Pool(5) as p:
print(p.map(network_op, stocks))
推荐阅读
- json - 超过最大堆栈深度 Laravel 集合资源
- javascript - React:将脚本标签添加到头部但仍然无法正常工作?
- json - 反序列化 JSON 对象的属性仅在存储库类中始终为空
- r - 使用 is.na 时需要 TRUE/FALSE 的 R 缺失值
- java - 具有泛型类型的 WebFlux WebClient
- apache-spark - 当在火花代码中多次引用 DF 时(如果我们不使用持久化),是否每次使用 DAG 创建 DataFrame?
- javascript - 我的 ajax 请求不返回数据但返回一个空数组
- sockets - 有没有办法通过 TCP 转发 UDP 流量?
- scala - isEmpty 为空集返回 false
- c - 具有相应字母的随机数生成器