鱼C论坛

 找回密码
 立即注册
查看: 1366|回复: 8

求帮助看看这个代码为什么线程执行一次就断掉了

[复制链接]
发表于 2019-4-16 21:47:22 | 显示全部楼层 |阅读模式
5鱼币
## 下面是我的代码。在mian函数里面是我开启线程的函数,并且10秒执行一次。当执行函数写self.put_data_body。线程执行一次就断掉了。但是当函数改为self.main的时候就不会断掉。这是为什么 。问题出在哪?
求大佬告知。万分感谢。谢谢

import os
import time
from threading import Timer
from redis import StrictRedis
from datetime import datetime, timedelta
import json


# 北京:BJS、上海:SHA、广州:CAN、深圳:SZX、成都:CTU
# 杭州:HGH、武汉:WUH、西安:SIA、重庆:CKG、青岛:TAO
# 长沙:CSX、南京:NKG、厦门:XMN、昆明:KMG、大连:DLC
# 天津:TNS、郑州:CGO、三亚:SYX、济南:TNA、福州:FOC
CITYCODE = [
    'BJS', 'SHA', 'CAN', 'SZX', 'CTU',
    'HGH', 'WUH', 'SIA', 'CKG', 'TAO',
    'CSX', 'NKG', 'XMN', 'KMG', 'DLC',
    'TNS', 'CGO', 'SYX', 'TNA', 'FOC'
    ]
# redis配置
REDIS_HOST = '127.0.0.1'
REDIS_PORT = 6379
REDIS_DB = 0
REDIS_PASSWD = '123456'


class OperateRedis:
    def __init__(self, time_num):
        self.citycode = CITYCODE
        self.time_num = time_num

        self.redis_host = REDIS_HOST
        self.redis_port = REDIS_PORT
        self.redis_db = REDIS_DB
        self.redis_passwd = REDIS_PASSWD

        self.redis_c = self.conn_redis()

    def conn_redis(self):
        redis_c = StrictRedis(
                host=self.redis_host,
                port=self.redis_port,
                db=self.redis_db,
                password=self.redis_passwd
            )
        return redis_c

    def put_data_body(self):
        count_list = self.requestbody()
        for data_body in count_list:
            data_body = json.dumps(data_body)
            self.redis_c.sadd('data_body', data_body)

    def requestbody(self):
        count_list = []
        for departCityCode in self.citycode:
            for arriveCityCode in self.citycode:
                if departCityCode == arriveCityCode:
                    continue
                deparData = datetime.now()
                for i in range(10):
                    data_body = dict()
                    head = dict()
                    data = dict()
                    data['departCityCode'] = departCityCode
                    data['arriveCityCode'] = arriveCityCode
                    data['departDate'] = (deparData + timedelta(days=i)).strftime('%Y-%m-%d')
                    data_body.update(head)
                    data_body.update(data)
                    count_list.append(data_body)
        return count_list

    def main(self):
        print(time.time())
        timer = Timer(self.time_num, self.put_data_body)
        timer.start()


if __name__ == "__main__":
    time_num = 10
    operateredis = OperateRedis(time_num)
    print("自动入队开启")
    operateredis.main()

#pid = os.fork()

# os.getpid()获取当前进程id,os.getppid()获取父进程id
#if pid == 0:
#    print("A",os.getpid(),os.getppid())
#else:
#    print("B",os.getpid(),os.getppid())

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-16 21:55:44 | 显示全部楼层
都在用timer了,还不知道timer的工作原理?
参考:
https://blog.csdn.net/a349458532/article/details/51586971
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-16 22:23:47 | 显示全部楼层
ba21 发表于 2019-4-16 21:55
都在用timer了,还不知道timer的工作原理?
参考:
https://blog.csdn.net/a349458532/article/details/5 ...

谢谢。看了,但是感觉并没有讲到什么东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-16 22:49:14 | 显示全部楼层
看了一些资料,已经解决了这个问题了,貌似对于使用timer来做定时器,调用的函数只能是自身。否则就会出现执行一次后线程断掉。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-16 23:16:57 | 显示全部楼层
ErTian 发表于 2019-4-16 22:23
谢谢。看了,但是感觉并没有讲到什么东西

不是没讲到,是你看不明白吧。看不明白不要说别个没有讲到。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 10:56:00 | 显示全部楼层
ba21 发表于 2019-4-16 23:16
不是没讲到,是你看不明白吧。看不明白不要说别个没有讲到。

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-4-30 10:57:59 | 显示全部楼层
ba21 发表于 2019-4-16 23:16
不是没讲到,是你看不明白吧。看不明白不要说别个没有讲到。

即便是我看不明白我才会来提问,提问前我肯定百度或者谷歌了,不明白才回来询问。如果我什么都看明白了就不需要来询问了。所以我希望回复的人能进行一个讲解。而不是你这样的。谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-4-30 18:53:01 | 显示全部楼层
ErTian 发表于 2019-4-30 10:57
即便是我看不明白我才会来提问,提问前我肯定百度或者谷歌了,不明白才回来询问。如果我什么都看明白了就 ...

人家说得明明白白time只执行一次,跟你说就是浪费口水。好心答复你没好报。鬼才理你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-8-10 11:34:43 | 显示全部楼层
ba21 发表于 2019-4-30 18:53
人家说得明明白白time只执行一次,跟你说就是浪费口水。好心答复你没好报。鬼才理你

呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表