码迷,mamicode.com
首页 > 编程语言 > 详细

threading多线程模块

时间:2018-05-17 16:51:44      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:get   就是   img   port   实例   技术   设置   wait函数   ima   

1 基本实现

Thread(target=函数名,args=(以元组形式传递的实参,要加","))

th = threading.Thread(target=run,args=(i,))就是实例化一个线程

th.start()就是对实例调用启动函数。

在内部,主线程就会创建30个子线程,子线程并发执行,所以虽然每个线程sleep(3),但是是并发执行的。

进程总耗时3s出头。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)

for i in range(30):
    th = threading.Thread(target=run,args=(i,))
    th.start()

 

2 深入理解线程

2.1 主线程和子线程

程序执行时,产生一个进程,进程里首先有一个主线程,每个执行的是子线程

使用threading.current_thread(),发现在for循环中是主线程,在run函数里是子线程。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)

for i in range(3):
    th = threading.Thread(target=run,args=(i,))
    print(threading.current_thread())
    th.start()
>>>>
<_MainThread(MainThread, started 13112)>
run 0
<_MainThread(MainThread, started 13112)>
run 1
<_MainThread(MainThread, started 13112)>
run 2

  

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    print(threading.current_thread())
    time.sleep(3)

for i in range(3):
    th = threading.Thread(target=run,args=(i,))
    th.start()
>>>>
run 0
<Thread(Thread-1, started 9976)>
run 1
<Thread(Thread-2, started 9980)>
run 2
<Thread(Thread-3, started 10800)>

  

2.2 子线程的并发性

cost_time的打印值:cost time 0.07500743865966797

发现没有在上面的for循环结束后再执行cost_time = time.time() - start_time语句。

因为每个实例化线程就是创建子线程,创建完后子线程自己去运行。主线程马上进入下一个执行语句,不会等待子线程执行完毕。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(10)

start_time = time.time()

for i in range(600):
    th = threading.Thread(target=run,args=(i,))
    th.start()

cost_time = time.time() - start_time
print(‘cost time‘, (cost_time))

  

3 JOIN()

就是wait函数,一个线程调用join(),主线程就会等子线程执行完毕再往下走.

在这个程序中,相当于线程单并发顺序执行。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(1)

start_time = time.time()

for i in range(10):
    th = threading.Thread(target=run,args=(i,))
    th.start()
    th.join()

cost_time = time.time() - start_time
print(‘cost time‘, (cost_time))

>>>

E:\Python\2018L1\venv\Scripts\python.exe E:/Python/2018L1/test/threadingserver.py
run 0
run 1
run 2
run 3
run 4
run 5
run 6
run 7
run 8
run 9
cost time 10.010000944137573

  

创建空列表t_list,然后把线程实例作为元素追加到列表(不在这里写join,不然会在每个线程中顺序sleep。)

在一个for循环里,让每个实例执行join()。

最后cost time 3.002300262451172

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)

start_time = time.time()
t_list = []
for i in range(10):
    th = threading.Thread(target=run,args=(i,))
    th.start()
    t_list.append(th)

for i in t_list:
    i.join()

cost_time = time.time() - start_time
print(‘cost time‘, (cost_time))

  

4 setDaemon

当主线程退出,守护子线程不管有没有执行完毕,都会马上退出。

对于非守护子线程,主线程会等它执行完毕再退出。

对于守护线程,主线程不会等它执行完毕,而是直接退出。

 

4.1

以下程序,虽然没有join函数,但主线程也会在所有线程执行完毕后才退出。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)
    print(threading.current_thread())

for i in range(3):
    th = threading.Thread(target=run,args=(i,))
    #th.setDaemon(True)
    th.start()

 

技术分享图片

 

4.2

如果把子线程都设置为守护线程,就是说主线程不会在它执行完毕再退出,而是直接退出。

print(threading.current_thread())还没执行,就已经退出,不会再执行

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)
    print(threading.current_thread())

for i in range(3):
    th = threading.Thread(target=run,args=(i,))
    th.setDaemon(True)
    th.start()

  

4.3

主线程的执行时间比守护子线程长。在主线程退出前子线程已执行完毕。

import time
import threading
def run(arg):
    print(‘run %s‘ %(arg))
    time.sleep(3)
    print(threading.current_thread())

for i in range(3):
    th = threading.Thread(target=run,args=(i,))
    th.setDaemon(True)
    th.start()
time.sleep(4)

  

threading多线程模块

标签:get   就是   img   port   实例   技术   设置   wait函数   ima   

原文地址:https://www.cnblogs.com/jabbok/p/9051619.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!