IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python多线程的创建(带参数)和销毁(二)进阶篇 -> 正文阅读

[Python知识库]python多线程的创建(带参数)和销毁(二)进阶篇

由于我实际使用中遇到了,开了线程后,销毁线程但是由于奇怪的原因一直没有成功,定位后发现,是由于线程内有死循环的原因。

由于机制问题导致线程必须要完成当前的操作后才能退出,死循环的话就退不了,但是也有办法.

举个简单的例子如下:

import threading
import time
class MyThread(threading.Thread):
  def __init__(self):
    threading.Thread.__init__(self)
    self.Flag=True        #停止标志位
    self.Parm=0         #用来被外部访问的
    #自行添加参数
  
  def run(self):
    while(True):
      if(not self.Flag):
        break
      else:
        time.sleep(10)
        print(time.strftime('%Y.%m.%d %H:%M:%S ',time.localtime(time.time())))
  
  def setFlag(self,parm):     #外部停止线程的操作函数
    self.Flag=parm #boolean
 
  def setParm(self,parm):     #外部修改内部信息函数
    self.Parm=parm
 
  def getParm(self):       #外部获得内部信息函数
    return self.Parm
 
 
if __name__=="__main__":
  testThread=MyThread()
  testThread.setDaemon(True)     #设为保护线程,主进程结束会关闭线程
  testThread.getParm()      #获得线程内部值
  testThread.setParm(1)      #修改线程内部值
  testThread.start()       #开始线程
  print(testThread.getParm())    #输出内部信息
  time.sleep(2)          #主进程休眠 2 秒
  print(time.strftime('%Y.%m.%d %H:%M:%S ',time.localtime(time.time())))
  testThread.setFlag(False)      #修改线程运行状态
  time.sleep(2)          #2019.04.25 修改
  print(testThread.is_alive())  #查看线程运行状态
  time.sleep(10) 
  print(testThread.is_alive())  #查看线程运行状态

运行后发现:

1
2022.03.30 10:34:23 
True
2022.03.30 10:34:31 
False

实际按需修改:

def track_strategy_worker(self, strategy, name, interval=10, **kwargs):
        """下单worker
        :param strategy: 策略id
        :param name: 策略名字
        :param interval: 策略的时间间隔,单位为秒"""
        while True:
            if (not self.flag):
                break
            else:
                #print('轮询间隔:'+time.strftime('%Y.%m.%d %H:%M:%S ',time.localtime(time.time()))) 
                try:
                    transactions = self.query_strategy_transaction(
                        strategy, **kwargs
                    )
                # pylint: disable=broad-except
                except Exception as e:
                    logger.exception("无法获取策略 %s 调仓信息, 错误: %s, 跳过此次调仓查询", name, e)
                    time.sleep(3)
                    continue
                for transaction in transactions:
                    trade_cmd = {
                        "strategy": strategy,
                        "strategy_name": name,
                        "action": transaction["action"],
                        "stock_code": transaction["stock_code"],
                        "amount": transaction["amount"],
                        "price": transaction["price"],
                        "datetime": transaction["datetime"],
                    }
                    if self.is_cmd_expired(trade_cmd):
                        continue
                    logger.info(
                        "策略 [%s] 发送指令到交易队列, 股票: %s 动作: %s 数量: %s 价格: %s 信号产生时间: %s",
                        name,
                        trade_cmd["stock_code"],
                        trade_cmd["action"],
                        trade_cmd["amount"],
                        trade_cmd["price"],
                        trade_cmd["datetime"],
                    )
                    self.trade_queue.put(trade_cmd)
                    self.add_cmd_to_expired_cmds(trade_cmd)
                try:
                    for _ in range(interval):
                        time.sleep(1)
                except KeyboardInterrupt:
                    logger.info("程序退出")
                    break

修改后:

class track_strategy_worker(self, strategy, name, interval=10, **kwargs):
    def __init__(self_t):
        threading.Thread.__init__(self_t)
        self_t.Flag=True        #停止标志位
        self_t.Parm=0         #用来被外部访问的
        #自行添加参数
    def run(self_t): 
        while True:
            if (not self_t.flag):
                break
            else:
                print('轮询间隔:'+time.strftime('%Y.%m.%d %H:%M:%S ',time.localtime(time.time()))) 
                try:
                    transactions = self.query_strategy_transaction(
                        strategy, **kwargs
                    )
                # pylint: disable=broad-except
                except Exception as e:
                    logger.exception("无法获取策略 %s 调仓信息, 错误: %s, 跳过此次调仓查询", name, e)
                    time.sleep(3)
                    continue
                for transaction in transactions:
                    trade_cmd = {
                        "strategy": strategy,
                        "strategy_name": name,
                        "action": transaction["action"],
                        "stock_code": transaction["stock_code"],
                        "amount": transaction["amount"],
                        "price": transaction["price"],
                        "datetime": transaction["datetime"],
                    }
                    if self.is_cmd_expired(trade_cmd):
                        continue
                    logger.info(
                        "策略 [%s] 发送指令到交易队列, 股票: %s 动作: %s 数量: %s 价格: %s 信号产生时间: %s",
                        name,
                        trade_cmd["stock_code"],
                        trade_cmd["action"],
                        trade_cmd["amount"],
                        trade_cmd["price"],
                        trade_cmd["datetime"],
                    )
                    self.trade_queue.put(trade_cmd)
                    self.add_cmd_to_expired_cmds(trade_cmd)
                try:
                    for _ in range(interval):
                        time.sleep(1)
                except KeyboardInterrupt:
                    logger.info("程序退出")
                    break
    def setFlag(self_t,parm):     #外部停止线程的操作函数
        self_t.Flag=parm #boolean
     
    def setParm(self_t,parm):     #外部修改内部信息函数
        self_t.Parm=parm
     
    def getParm(self_t):       #外部获得内部信息函数
        return self_t.Parm

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 00:00:16  更:2022-04-01 00:01:31 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 20:39:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码