zx2000 发表于 2019-10-18 20:25

python 有关多线程的问题,哭了

本帖最后由 zx2000 于 2019-10-18 21:01 编辑

刚刚学习多线程,碰到了一个问题:
我想批量创建3个线程,并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
3个线程结束后,再次创建3个线程并且同时start。
这样循环10次。
但是这个代码写出来后,是直接for循环10次,然后同时一下子创建了30个线程。
怎样创建3个线程后,待3个线程都结束了,才开始循环下一次?
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方法比较简单,也成功了。不过还得感谢大佬出手相助{:301_993:}

zx2000 发表于 2019-10-18 20:57

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


成功!感谢大佬出手相助!!!{:301_993:}

用温柔将我杀死 发表于 2019-10-18 21:06

有一个阻塞的函数

伊辰凌风 发表于 2019-10-18 22:09

线程池是最佳选择4楼正解
页: [1] 2
查看完整版本: python 有关多线程的问题,哭了