吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1740|回复: 11
收起左侧

[已解决] python 有关多线程的问题,哭了

[复制链接]
zx2000 发表于 2019-10-18 20:25
本帖最后由 zx2000 于 2019-10-18 21:01 编辑

刚刚学习多线程,碰到了一个问题:
我想批量创建3个线程,并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
这样循环10次。
但是这个代码写出来后,是直接for循环10次,然后同时一下子创建了30个线程。
怎样创建3个线程后,待3个线程都结束了,才开始循环下一次?
[Python] 纯文本查看 复制代码
import time
import threading
def test(strs):
    time.sleep(5)
    print("这是由第"+str(strs+1)+"号线程执行的")


if __name__ == '__main__':
    for j in range(10):
        li=[];
        for i in range(3):
            th=threading.Thread(target=test,args=(str(i)),)
            li.append(th)
        for th in li:
            th.start();
        print("程序运行了"+str(j)+"次")

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

邓大侠 发表于 2019-10-18 20:51
线程对象有一个join方法,使得线程成为堵塞的线程,看我的代码.
import time
import threading


def test(strs):
    time.sleep(5)
    print("这是由第" + str(strs + 1) + "号线程执行的")


if __name__ == '__main__':
    for j in range(10):
        li = []
        for i in range(3):
            th = threading.Thread(target=test, args=(i,) )
            li.append(th)
            th.start()
        for th in li:
            th.join()
        print("程序运行了" + str(j) + "次")
boy7928 发表于 2019-10-18 20:38
加个变量 判断一下  比如线程启动  i=3  就不执行创建线程 等线程结束的时候 去 i-- 然后就能继续创建线程了
15774211127 发表于 2019-10-18 20:38
本帖最后由 15774211127 于 2019-10-18 20:47 编辑

把循环单独提取成一个方法,有一个参数(用来接收还剩余没生成的线程组数,比如你刚开始是10,如果为0直接退出)
然后新建一个全局变量等于当前次数生成的线程数
每个线程执行完毕全局变量减1,并且判断全局变量是否等于0,如果等于就(将剩余没生成的线程组数减1,再调用一次生成线程的方法)
大概就是下面这样(手写的没测试)


import time
import threading

count = 0;

def test(strs, sum):

    time.sleep(5)

    print("这是由第"+str(strs+1)+"号线程执行的")

    count--

    if count==0:

        generate(sum - 1)

def generate(sum):

    if sum <= 0:
        return
    li=[];

    for i in range(3):

        th=threading.Thread(target=test,args=(str(i), sum),)

        li.append(th)

    count = len(li)

    for th in li:

        th.start();



if __name__ == '__main__':

    generate(10);

        
德古拉伯 发表于 2019-10-18 20:45
用python线程池啊,他不会释放线程,而是归还线程。
https://www.cnblogs.com/zhang293/p/7954353.html
ying656 发表于 2019-10-18 20:52
2楼正解  3楼牛逼 4楼大神 而我还没你会的多。
 楼主| zx2000 发表于 2019-10-18 20:56
15774211127 发表于 2019-10-18 20:38
把循环单独提取成一个方法,有一个参数(用来接收还剩余没生成的线程组数,比如你刚开始是10,如果为0直接 ...

5楼用的join方法比较简单,也成功了。不过还得感谢大佬出手相助
 楼主| zx2000 发表于 2019-10-18 20:57
邓大侠 发表于 2019-10-18 20:51
线程对象有一个join方法,使得线程成为堵塞的线程,看我的代码.
import time
import threading

成功!感谢大佬出手相助!!!
用温柔将我杀死 发表于 2019-10-18 21:06
有一个阻塞的函数
伊辰凌风 发表于 2019-10-18 22:09
线程池是最佳选择4楼正解
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-27 00:33

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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