V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
RandomUser
V2EX  ›  问与答

python 新手请教一个应该很简单的小功能

  •  
  •   RandomUser · 2016-12-29 10:24:05 +08:00 · 1715 次点击
    这是一个创建于 2894 天前的主题,其中的信息可能已经有所发展或是发生改变。
    想写一个脚本实时监控秒杀列表中指定商品的库存,并发邮件提醒
    目前有两个问题:
    1. 程序使用最下方注释掉的代码,这样每个商品都要重复写几行语句,能正常运行,但是在有多个商品符合条件时发送邮件后提示“ connection unexpectedly closed ”,好像是 smtp 的问题?
    2. 把那几条语句封装一下,即现在用的 check 函数,但是后台只看到 goodName1 在运行, goodName2 根本没执行?



    #!/usr/bin/python
    # -*- coding: UTF-8 -*-

    import smtplib
    from email.mime.text import MIMEText
    import requests, re, json, threading
    from threading import Timer
    import time
    import sys, os

    reload(sys)
    sys.setdefaultencoding('utf8')


    def send_mail(to_list, sub, content):
    ...

    class Buy(object):
    stockNum = 0
    totalStockNum = 0

    def __init__(self, name):
    self.goodsName = name

    def check_stock(self):
    r1 = requests.get()
    listNum = len(r1.json()["data"]["list"])

    for i in range(1, listNum, 1):
    goodName = r1.json()["data"]["list"][i - 1]["goodsName"]
    if self.goodsName in goodName:
    stock = r1.json()["data"]["list"][i - 1]["stockNum"] #获取当前可售库存
    total = r1.json()["data"]["list"][i - 1]["totalStockNum"] #获取当前总库存
    add = total - self.totalStockNum #计算本次新增库存
    if stock <> 0 and stock > self.stockNum:
    send_mail(mailto_list, goodName + str(stock), str(add))
    print "send success"
    self.stockNum = stock
    self.totalStockNum = total


    def check(goodName):
    p1 = Buy(goodName)
    while True:
    timer1 = threading.Timer(5, Buy.check_stock, (p1,))
    timer1.start()
    timer1.join()


    if __name__ == '__main__':
    check("goodName1")
    check("goodName2")

    # p1 = Buy("goodName1")
    # p2 = Buy("goodName2")

    # while True:
    # timer1 = threading.Timer(5, Buy.check_stock, (p1,))
    # timer2 = threading.Timer(5, Buy.check_stock, (p2,))
    # timer1.start()
    # timer2.start()
    3 条回复    2016-12-29 12:56:55 +08:00
    jotsai
        1
    jotsai  
       2016-12-29 12:25:51 +08:00
    第 1 个线程启动之后就 join 了,这时候会等第 1 个线程执行完才会接着启动第 2 个线程。
    你需要先将两个线程都启动之后,再对两个线程 join 。
    RandomUser
        2
    RandomUser  
    OP
       2016-12-29 12:52:30 +08:00
    @jotsai 意思是我还是得像注释里的代码一样每个商品都单独重复写那几条语句?类似这种每隔几秒还有其他的实现方式吗?


    # timer1.join()
    # timer2.join()
    jotsai
        3
    jotsai  
       2016-12-29 12:56:55 +08:00
    @RandomUser 看下 python 的线程池,应该可以解决你的问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2870 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:19 · PVG 20:19 · LAX 04:19 · JFK 07:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.