1.多线程简单介绍
# -*- coding: utf-8 -*-
import threading
def main():
print(threading.active_count()) #运行的线程个数
print(threading.enumerate()) #运行的是哪些线程
print(threading.current_thread()) #当下运行的是哪个线程
if __name__ == 'main':
main()
6
[<_MainThread(MainThread, started 13824)>, <Thread(Thread-4, started daemon 1452)>, <Heartbeat(Thread-5, started daemon 14768)>, <HistorySavingThread(IPythonHistorySavingThread, started 4796)>, <ParentPollerWindows(Thread-3, started daemon 1852)>, <GarbageCollectorThread(Thread-6, started daemon 992)>]
<_MainThread(MainThread, started 13824)>
2.添加多线程
# -*- coding: utf-8 -*-
import threading
def thread_job():
print('This is an added Theard,number is %s' % threading.current_thread())
def main():
added_thread = threading.Thread(target=thread_job)
added_thread.start()
if __name__ == 'main':
main()
This is an added Theard,number is <Thread(Thread-10, started 8780)>
3. join 功能
# -*- coding: utf-8 -*-
import threading
import time
def thread_job():
print("T1 start\n")
for i in range(10):
time.sleep(0.1)
print("T1 finish\n")
def main():
added_thread = threading.Thread(target=thread_job,name="T1")
added_thread.start()
print("all done\n")
if __name__ == 'main':
main()
T1 start
all done
T1 finish
# -*- coding: utf-8 -*-
import threading
import time
def thread_job():
print("T1 start\n")
for i in range(10):
time.sleep(0.1)
print("T1 finish\n")
def main():
added_thread = threading.Thread(target=thread_job,name="T1")
added_thread.start()
added_thread.join()
print("all done\n")
if __name__ == 'main':
main()
# -*- coding: utf-8 -*-import threadingimport tidef thread_job():
print("T1 start\n")
for i in range(10):
time.sleep(0.1)
print("T1 finish\n")
def thread_job2():
print("T2 start\n")
print("T2 finish\n")
def main():
added_thread = threading.Thread(target=thread_job,name="T1")
added_thread2 = threading.Thread(target=thread_job2,name="T2")
added_thread.start()
added_thread2.start()
#added_thread.join() #added_thread2.join()
print("all done\n")
if __name__ == 'main':
main()
4. Queue 功能
# -*- coding: utf-8 -*-
import threading
from queue import Queue
def job(l,q):
for i in range(len(l)):
l[i] = l[i]**2
q.put(l) #将计算结果放入q,不能用return
def multiThreading():
q = Queue()
threads=[] #装四个线程
data = [[1,2,3],[4,5,6],[6,6,6],[8,8,8]]
for i in range(4):#分别运行四个线程并传入参数
t = threading.Thread(target=job,args=(data[i],q))
t.start()
threads.append(t)
for thread in threads:
thread.join()
results=[] #将结果一个个取出到 results 并输出
for _ in range(4):
results.append(q.get())
print(results)
if __name__=="__main__":
multiThreading()
5. 多线程控制 GIL
import threading
from queue import Queue
import copy
import time
def job(l, q):
res = sum(l)
q.put(res)
def multithreading(l):
q = Queue()
threads = []
for i in range(4):
t = threading.Thread(target=job, args=(copy.copy(l), q), name='T%i' % i)
t.start()
threads.append(t)
[t.join() for t in threads]
total = 0
for _ in range(4):
total += q.get()
print(total)
def normal(l):
total = sum(l)
print(total)
if __name__ == '__main__':
# 不用多线程方法
l = list(range(1000000))
s_t = time.time()
normal(l*4)
print('normal: ',time.time()-s_t)
# 用多线程方法
s_t = time.time()
multithreading(l)
print('multithreading: ', time.time()-s_t)
6. 锁 lock
import threading
def job1():
global A
for i in range(10):
A+=1
print('job1',A)
def job2():
global A
for i in range(10):
A+=10
print('job2',A)
if __name__== '__main__':
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
import threading
def job1():
global A,lock
lock.acquire()
for i in range(10):
A+=1
print('job1',A)
lock.release()
def job2():
global A,lock
lock.acquire()
for i in range(10):
A+=10
print('job2',A)
lock.release()
if __name__== '__main__':
lock=threading.Lock()
A=0
t1=threading.Thread(target=job1)
t2=threading.Thread(target=job2)
t1.start()
t2.start()
t1.join()
t2.join()
评论(0)
您还未登录,请登录后发表或查看评论