vcbeaut 发表于 2020-9-15 16:14:23

python多线程怎么用?

python一般多线程是用
import thread还是import threading?

然后,怎么让主程序等待所有子线程运行完才结束?

疾风怪盗 发表于 2020-9-15 16:22:44

本帖最后由 疾风怪盗 于 2020-9-15 16:26 编辑

参考一下
# coding=utf-8
import threading
from time import ctime, sleep


def music(func):
    print("I was listening to %s. %s" % (func, ctime()))
    sleep(1)


def move(func):
    print("I was at the %s! %s" % (func, ctime()))
    sleep(5)


if __name__ == '__main__':
    threads = []
    for i in range(0, 6):
      t1 = threading.Thread(target=music, args=(u'爱情买卖',))
      threads.append(t1)

    for j in range(0, 4):
      t2 = threading.Thread(target=move, args=(u'阿凡达',))
      threads.append(t2)
    for t in threads:
      t.setDaemon(True)
      t.start()
    print("all over %s" % ctime())

vcbeaut 发表于 2020-9-15 16:40:10

疾风怪盗 发表于 2020-9-15 16:22
参考一下

您好,这里把每一个子线程Daemon属性设置为True了,主线程就会不等待子线程了。那不就可能会导致子线程没运行完吗?

vcbeaut 发表于 2020-9-15 16:45:13

疾风怪盗 发表于 2020-9-15 16:22
参考一下

这里t.setDaemon(False)就可以了

疾风怪盗 发表于 2020-9-15 16:48:58

本帖最后由 疾风怪盗 于 2020-9-15 17:07 编辑

好像是,然后是可以在循环外增加个join(),join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。
    for t in threads:
      t.setDaemon(True)
      t.start()
    t.join()

join()方法的位置是在for循环外的,也就是说必须等待for循环里的两个进程都结束后,才去执行主进程。

vcbeaut 发表于 2020-9-15 17:03:57

疾风怪盗 发表于 2020-9-15 16:48
好像是,然后是可以在循环外增加个join(),join()的作用是,在子线程完成运行之前,这个子线程的父线程将 ...

join()如果再for循环外,那么前面的t不就被覆盖了吗?

疾风怪盗 发表于 2020-9-15 17:05:34

vcbeaut 发表于 2020-9-15 17:03
join()如果再for循环外,那么前面的t不就被覆盖了吗?

你试试效果吧,我一直是参考这篇做法来写多线程的

vcbeaut 发表于 2020-9-15 17:09:08

疾风怪盗 发表于 2020-9-15 17:05
你试试效果吧,我一直是参考这篇做法来写多线程的

好的,谢谢
页: [1]
查看完整版本: python多线程怎么用?