Python 的并发模型相比有何特点

Python012

Python 的并发模型相比有何特点,第1张

使用tornado的前提是你的服务是IO密集型的,并且你得写异步api,也可以请参考我签名中的框架,把tornado改造成eventloop+threadpool (GitHub - nikoloss/iceworld: tonado的multi-thread 多线程封装)。我们公司的android ios wap后台全是这套框架在提供服务。目前已经切换到一个分布式http响应群组里面了,此时tornado只是作为一个中继的gateway存在:GitHub - nikoloss/cellnest: 分布式service

在没有阻塞的情况下,python的性能肯定不如编译型语言。这种全异步的模型的优势也无法体现出来,一旦有IO操作了,这种全异步模型的第一步accpet新连接的操作并不会暂停,也就是只要有内容抵达,至少ioloop这个环节是可以照单全收的,接收之后协程处理,随着并发量增长它的性能下降是平稳且平滑的。反观线程模型,如果消费数据赶不上新连接新数据的生产,性能就会直线下降。

你的700qps差不多,你可以换3.1或者3.2的tornado试试,1100~1400应该可以跑出来。当然追求一个静态文本的输出性能是否有必要,我觉得实际情况比这种单纯的压测要复杂的多。

这是一个多元支持向量机回归的模型,以下是一个参考的实现代码:

import numpy as npimport matplotlib.pyplot as pltfrom sklearn import svmfrom sklearn.metrics import r2_score

# 模拟数据

np.random.seed(0)

X = np.sort(5 * np.random.rand(80, 1), axis=0)

y = np.sin(X).ravel()

y[::5] += 3 * (0.5 - np.random.rand(16))

# 分割数据

train_X = X[:60]

train_y = y[:60]

test_X = X[60:]

test_y = y[60:]

# 模型训练

model = svm.SVR(kernel='rbf', C=1e3, gamma=0.1)

model.fit(train_X, train_y)

# 预测结果

pred_y = model.predict(test_X)# 计算R2r2 = r2_score(test_y, pred_y)

# 对比图

plt.scatter(test_X, test_y, color='darkorange', label='data')

plt.plot(test_X, pred_y, color='navy', lw=2, label='SVR model')

plt.title('R2={:.2f}'.format(r2))

plt.legend()

plt.show()

上面的代码将数据分为训练数据和测试数据,使用SVR模型对训练数据进行训练,然后对测试数据进行预测。计算预测结果与真实值的R2,最后将结果画出对比图,以评估模型的效果。