一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 在Python中通過threading模塊定義和調用線程的方法

在Python中通過threading模塊定義和調用線程的方法

2020-09-02 09:11磁針石 Python

由于著名的GIL的存在,Python中雖然能創建多條線程,但卻不能同時執行...anyway,這里我們還是來學習一下在Python中通過threading模塊定義和調用線程的方法

定義線程

最簡單的方法:使用target指定線程要執行的目標函數,再使用start()啟動。

語法:

?
1
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})

group恒為None,保留未來使用。target為要執行的函數名。name為線程名,默認為Thread-N,通常使用默認即可。但服務器端程序線程功能不同時,建議命名。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/usr/bin/env python3
# coding=utf-8
import threading
 
def function(i):
  print ("function called by thread {0}".format(i))
threads = []
 
for i in range(5):
  t = threading.Thread(target=function , args=(i,))
  threads.append(t)
  t.start()
  t.join()

執行結果:

?
1
$ ./threading_define.py
?
1
2
3
4
5
function called by thread 0
function called by thread 1
function called by thread 2
function called by thread 3
function called by thread 4

確定當前線程

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python3
# coding=utf-8
 
import threading
import time
 
def first_function():
  print (threading.currentThread().getName()+ str(' is Starting \n'))
  time.sleep(3)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
def second_function():
  print (threading.currentThread().getName()+ str(' is Starting \n'))
  time.sleep(2)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
def third_function():
  print (threading.currentThread().getName()+\
  str(' is Starting \n'))
  time.sleep(1)
  print (threading.currentThread().getName()+ str( ' is Exiting \n'))
  
if __name__ == "__main__":
  t1 = threading.Thread(name='first_function', target=first_function)
  t2 = threading.Thread(name='second_function', target=second_function)
  t3 = threading.Thread(name='third_function',target=third_function)
  t1.start()
  t2.start()
  t3.start()

執行結果:

?
1
$ ./threading_name.py
?
1
2
3
4
5
6
first_function is Starting
second_function is Starting
third_function is Starting
third_function is Exiting
second_function is Exiting
first_function is Exiting

配合logging模塊一起使用:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
# coding=utf-8
 
import logging
import threading
import time
 
logging.basicConfig(
  level=logging.DEBUG,
  format='[%(levelname)s] (%(threadName)-10s) %(message)s',
  )
  
def worker():
  logging.debug('Starting')
  time.sleep(2)
  logging.debug('Exiting')
  
def my_service():
  logging.debug('Starting')
  time.sleep(3)
  logging.debug('Exiting')
  
t = threading.Thread(name='my_service', target=my_service)
w = threading.Thread(name='worker', target=worker)
w2 = threading.Thread(target=worker) # use default name
w.start()
w2.start()
t.start()

執行結果:

?
1
$ ./threading_names_log.py[DEBUG] (worker  ) Starting
?
1
2
3
4
5
[DEBUG] (Thread-1 ) Starting
[DEBUG] (my_service) Starting
[DEBUG] (worker  ) Exiting
[DEBUG] (Thread-1 ) Exiting
[DEBUG] (my_service) Exiting


在子類中使用線程

前面我們的線程都是結構化編程的形式來創建。通過集成threading.Thread類也可以創建線程。Thread類首先完成一些基本上初始化,然后調用它的run()。run()方法會會調用傳遞給構造函數的目標函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/usr/bin/env python3
# coding=utf-8
 
import logging
import threading
import time
 
exitFlag = 0
 
class myThread (threading.Thread):
  def __init__(self, threadID, name, counter):
    threading.Thread.__init__(self)
    self.threadID = threadID
    self.name = name
    self.counter = counter
    
  def run(self):
    print ("Starting " + self.name)
    print_time(self.name, self.counter, 5)
    print ("Exiting " + self.name)
    
def print_time(threadName, delay, counter):
  while counter:
    if exitFlag:
      thread.exit()
    time.sleep(delay)
    print ("%s: %s" %(threadName, time.ctime(time.time())))
    counter -= 1
    
# Create new threads
thread1 = myThread(1, "Thread-1", 1)
thread2 = myThread(2, "Thread-2", 2)
# Start new Threads
thread1.start()
thread2.start()
print ("Exiting Main Thread")

執行結果:

?
1
$ ./threading_subclass.py
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Starting Thread-1
Starting Thread-2
Exiting Main Thread
Thread-1: Tue Sep 15 11:03:21 2015
Thread-2: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:22 2015
Thread-1: Tue Sep 15 11:03:23 2015
Thread-2: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:24 2015
Thread-1: Tue Sep 15 11:03:25 2015
Exiting Thread-1
Thread-2: Tue Sep 15 11:03:26 2015
Thread-2: Tue Sep 15 11:03:28 2015
Thread-2: Tue Sep 15 11:03:30 2015
Exiting Thread-2

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色综合网亚洲精品久久 | 亚洲视频一区网站 | 狠狠插入 | 成年人视频免费在线观看 | 五月色综合婷婷综合俺来也 | 国产高清在线不卡 | 国产在线一区二区视频 | 亚洲v成人天堂影视 | 成年看片免费高清观看 | 国产精品成人自拍 | 鄂州一家三口完整版免费 | 日本大尺度动漫在线观看缘之空 | 亚洲国产欧美另类 | 欧美一级在线全免费 | 果冻传媒在线视频观看免费 | 2019年国产高清情侣视频 | 黑人干我 | 男同精品视频免费观看网站 | 亚洲、国产综合视频 | 日韩高清在线高清免费 | 欧美日韩精品一区二区三区高清视频 | 男男视频18免费网站 | 国产美女屁股直流白浆视频无遮挡 | 精品一区二区三区 不卡高清 | 日韩影院在线观看 | 亚洲国产精品久久卡一 | 免费xxxx日本大片在线观看 | 情趣内衣在线观看 | 国产原创一区二区 | www.色婷婷.com | 校花被强迫np肉高h 校服下的白嫩小乳尖h1v1 | 白丝超短裙被输出娇喘不停小说 | 精品国产91高清在线观看 | 美女伊人网| 精品精品国产自在久久高清 | 第一次不是你高清在线观看 | 免费369看片入口 | 性欧美高清强烈性视频 | 啊啊啊好大视频 | 暖暖 免费 高清 中文 日本 | 精品国产一区二区三区久久久狼 |