7.2. 一种简单的 orderId 生成策略

以下是一种简单的 order id 生成策略,可以满足单机秒级峰值并发量小于 1000 的情况。

import time
from threading import RLock
from snbpy.common.domain.snb_config import SnbConfig
from snbpy.snb_api_client import SnbHttpClient

class SnbAgent():
    def __init__(self):
        self.config = SnbConfig()
        # 替换掉这里
        self.config.account = "DU1234567"
        # 替换掉这里
        self.config.key = "1234567"
        self.config.sign_type = 'None'
        self.config.snb_server = 'sandbox.snbsecurities.com'
        self.config.snb_port = '443'
        self.config.timeout = 1000
        self.config.schema = 'https'
        self.client = SnbHttpClient(self.config)
        self.last_ts = 0
        self.sq = 0
        self.lock = RLock()
        self.client.login()

    def gen_order_id(self):
        with self.lock:
            t = int(time.time())
            if self.last_ts == t:
                if self.sq == 999:
                    raise Exception("too many request in one second")
                else:
                    self.sq += 1
            else:
                self.last_ts = t
                self.sq = 0
            return "{}{:03}".format(self.last_ts, self.sq)