a情授001 发表于 2020-11-10 22:22

Python多线程登陆这样写的思路对不对,菜鸟一个希望大佬给出建议

本帖最后由 a情授001 于 2020-11-10 22:24 编辑

希望大佬指出毛病,或者大佬们有更好的思路。参考了pyec的多线程更改的import sys,traceback,threading,time
def get(u,p):
    print('账号:'+u,'密码:'+p)
    time.sleep(2)

def 多线程(线程数, 最长等待时间=0, 跟随主线程结束=False):
    n = 0
    u = ['a123-a456','b123-b456','c123-c456','d123-d456']
    任务数 = len(u)
    __多线程列表 = []
    剩余数 = 任务数
    try:
      while 剩余数 > 0:
            名字 = u.split('-')
            密码 = u.split('-')
            xkz = threading.Lock()
            for x in __多线程列表:
                if x.is_alive() == False:
                  __多线程列表.remove(x)
            if len(__多线程列表) >= 线程数:
                time.sleep(0.1)
            else:
                xkz.acquire()
                线程 = threading.Thread(target=get, args=(名字, 密码), daemon=跟随主线程结束)
                线程.start()
                __多线程列表.append(线程)
                剩余数 -= 1
                n += 1
                xkz.release()
            

      for i in __多线程列表:
            if 最长等待时间 <= 0:
                i.join()
            else:
                i.join(最长等待时间)
      return True
    except:
      print("{}|运行出错\r\n{}\r\n".format(sys._getframe().f_code.co_name, traceback.format_exc()))
      return False
      
def main():
    s = time.time()
    多线程(4)
    e = time.time()
    print(e-s)
   
main()

as614001 发表于 2020-11-10 23:25

错11111111111

wanwfy 发表于 2020-11-10 23:57

python的多线程就是鸡肋,只能用到单核,不能算真正的多线程.
用多进程或者异步应该更好一点.

XinSong 发表于 2020-11-10 23:57

好家伙,写作文{:1_893:}

pzx521521 发表于 2020-11-11 09:14

本帖最后由 pzx521521 于 2020-11-11 09:16 编辑

最好不要用中文 = =

如果是学threading.Lock()的demo, 代码没什么大问题, 少一个多个线程一起修改的东西
上面代码threading.Lock()是没必要的
因为没有同时修改的东西,
如果上锁了, 就和单线程的效率差不多了
当然因为你的是sleep, 所以还是会快很多的
同意3l 多线程最好不要用python, win和unix下实现不一样, 主要是GIL的限制
不过平常自己用用, 不跑满cpu 也很快了
推过生产环境还是 推荐go 其次java

thepoy 发表于 2020-11-11 12:28

锁好像放错了位置

c03xp 发表于 2020-11-11 14:35

python版易语言
页: [1]
查看完整版本: Python多线程登陆这样写的思路对不对,菜鸟一个希望大佬给出建议