哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮
有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。
一、 前言
1. 什么是线程
线程(Thread)也被称为轻量级进程,是操作系统能够进行调度的最小单位,它被包含在进行中,是进程中的实际运作单位。线程本身不拥有系统资源,但是与同进程中的其他线程共享进程资源。
一个进程中的多个线程可以创建和kill另一个线程,同一个进程中的多个线程之间可以并发执行。
2. 进程与线程
进程是资源分配的最小单位,一个程序至少有一个进程。
线程称程序执行的最小单位,一个进程至少有一个线程。
进程都有自己的独立地址空间、内存、数据栈等,所以进程占用资源多。由于进程的资源独立,通信不方便,故而进程间使用IPC通讯。
一个进程中可以存在多个线程,在单核CPU中每隔进程中同时只能运行一个线程,所以只有在多核CPU中在能实现多线程并发。
3. 为什么要用多线程
线程在程序中是独立,并且并发的执行流。与进程相比,进程中线程之间的隔离程度要小,其可以共享内存、文件句柄等。
线程的划分尺度小于进程,使得多线程的并发性要高。而进程在执行的过程中,系统会为其分配独立的内存单元,而线程内存共享,故而效率极大地得到了提升。
线程
二、 Python 多线程
1. 线程间等待 join
from time import sleep
from threading import Thread
import threading
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']
def download(movie):
sleep(2)
print(f'完成下载{movie}')
threads = []
for task in tasks:
t = Thread(target=download, name=task,args=(task,))
t.start()
threads.append(t)
for t in threads:
t.join()
print(threading.current_thread())
print('完成')
2. 其他
from time import sleep
from threading import Thread
import threading
tasks = ['move1','movie2','movie3','movie4','movie5','movie6']
def download(movie):
sleep(2)
for task in tasks:
t = Thread(target=download, name=task,args=(task,))
t.start()
print(f'{t.name},{t.ident},{t.is_alive()},{t.daemon}')
print(threading.current_thread())
print('完成')
3. 完整
import threading
import time
from queue import Queue
def job(l,q):
for i in range (len(l)):
l[i] = l[i]**2
q.put(l)
def multithreading():
q =Queue()
threads = []
data = [[1,2,3],[3,4,5],[4,4,4],[5,5,5]]
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 = []
for _ in range(4):
results.append(q.get())
print(results)
if __name__=='__main__':
multithreading()
4. 需求:主线程跑的时候,再开启个子线程,无需子线程的结果,相互独立
import threading, time
def T1():
time.sleep(3)
print(666)
def main():
thread = threading.Thread(target=T1, name='T1')
thread.start()
print(123)
return '6'
if __name__ == '__main__':
main()
参考:
https://blog.csdn.net/qq_16481211/article/details/80950979
<p><font face="楷体,华文行楷,隶书,黑体" color="red" size="4"><strong>哈喽,大家好,我是有勇气的牛排(全网同名)🐮🐮🐮</strong></font></p>
<p><font face="楷体,华文行楷,隶书,黑体" color="blue" size="4"><strong>有问题的小伙伴欢迎在文末评论,点赞、收藏是对我最大的支持!!!。</strong></font></p>
<h2><a id="__4"></a>一、 前言</h2>
<h3><a id="1__5"></a>1. 什么是线程</h3>
<p>线程(Thread)也被称为轻量级进程,是操作系统能够进行调度的最小单位,它被包含在进行中,是进程中的实际运作单位。线程本身不拥有系统资源,但是与同进程中的其他线程共享进程资源。</p>
<p>一个进程中的多个线程可以创建和kill另一个线程,同一个进程中的多个线程之间可以并发执行。</p>
<h3><a id="2__11"></a>2. 进程与线程</h3>
<p><strong>进程是资源分配的最小单位,一个程序至少有一个进程。<br />
线程称程序执行的最小单位,一个进程至少有一个线程。</strong></p>
<p>进程都有自己的独立地址空间、内存、数据栈等,所以进程占用资源多。由于进程的资源独立,通信不方便,故而进程间使用<strong>IPC通讯</strong>。</p>
<p>一个进程中可以存在多个线程,在单核CPU中每隔进程中同时只能运行一个线程,所以只有在多核CPU中在能实现<strong>多线程并发</strong>。</p>
<h3><a id="3__19"></a>3. 为什么要用多线程</h3>
<p>线程在程序中是独立,并且并发的执行流。与进程相比,进程中线程之间的隔离程度要小,其可以共享内存、文件句柄等。</p>
<p>线程的划分尺度小于进程,使得多线程的并发性要高。而进程在执行的过程中,系统会为其分配独立的内存单元,而线程内存共享,故而效率极大地得到了提升。</p>
<p>线程</p>
<h2><a id="_Python__26"></a>二、 Python 多线程</h2>
<h3><a id="1__join_27"></a>1. 线程间等待 join</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> sleep
<span class="hljs-keyword">from</span> threading <span class="hljs-keyword">import</span> Thread
<span class="hljs-keyword">import</span> threading
<span class="hljs-comment"># 小明要下载10个视频</span>
tasks = [<span class="hljs-string">'move1'</span>,<span class="hljs-string">'movie2'</span>,<span class="hljs-string">'movie3'</span>,<span class="hljs-string">'movie4'</span>,<span class="hljs-string">'movie5'</span>,<span class="hljs-string">'movie6'</span>]
<span class="hljs-keyword">def</span> <span class="hljs-title function_">download</span>(<span class="hljs-params">movie</span>):
<span class="hljs-comment"># print(f'开始下载{movie}')</span>
sleep(<span class="hljs-number">2</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-string">f'完成下载<span class="hljs-subst">{movie}</span>'</span>)
threads = []
<span class="hljs-keyword">for</span> task <span class="hljs-keyword">in</span> tasks:
t = Thread(target=download, name=task,args=(task,))
t.start() <span class="hljs-comment"># 启动线程</span>
threads.append(t)
<span class="hljs-keyword">for</span> t <span class="hljs-keyword">in</span> threads:
t.join() <span class="hljs-comment"># 当前线程等待线程 t 执行完成后再执行后面的代码</span>
<span class="hljs-built_in">print</span>(threading.current_thread())
<span class="hljs-built_in">print</span>(<span class="hljs-string">'完成'</span>)
</code></div></pre>
<h3><a id="2__56"></a>2. 其他</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">from</span> time <span class="hljs-keyword">import</span> sleep
<span class="hljs-keyword">from</span> threading <span class="hljs-keyword">import</span> Thread
<span class="hljs-keyword">import</span> threading
<span class="hljs-comment"># 小明要下载10个视频</span>
tasks = [<span class="hljs-string">'move1'</span>,<span class="hljs-string">'movie2'</span>,<span class="hljs-string">'movie3'</span>,<span class="hljs-string">'movie4'</span>,<span class="hljs-string">'movie5'</span>,<span class="hljs-string">'movie6'</span>]
<span class="hljs-keyword">def</span> <span class="hljs-title function_">download</span>(<span class="hljs-params">movie</span>):
<span class="hljs-comment"># print(f'开始下载{movie}')</span>
sleep(<span class="hljs-number">2</span>)
<span class="hljs-comment"># print(f'完成下载{movie}')</span>
<span class="hljs-keyword">for</span> task <span class="hljs-keyword">in</span> tasks:
<span class="hljs-comment"># 创建线程</span>
<span class="hljs-comment"># daemon :守护线程---当主线程执行完成后,马上终止当前的任务,不管是否完成。</span>
t = Thread(target=download, name=task,args=(task,))
t.start() <span class="hljs-comment"># 启动线程</span>
<span class="hljs-built_in">print</span>(<span class="hljs-string">f'<span class="hljs-subst">{t.name}</span>,<span class="hljs-subst">{t.ident}</span>,<span class="hljs-subst">{t.is_alive()}</span>,<span class="hljs-subst">{t.daemon}</span>'</span>)
<span class="hljs-built_in">print</span>(threading.current_thread())
<span class="hljs-built_in">print</span>(<span class="hljs-string">'完成'</span>)
</code></div></pre>
<h3><a id="3__83"></a>3. 完整</h3>
<pre><div class="hljs"><code class="lang-python"><span class="hljs-keyword">import</span> threading
<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">from</span> queue <span class="hljs-keyword">import</span> Queue
<span class="hljs-keyword">def</span> <span class="hljs-title function_">job</span>(<span class="hljs-params">l,q</span>):
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span> (<span class="hljs-built_in">len</span>(l)):
l[i] = l[i]**<span class="hljs-number">2</span>
q.put(l)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">multithreading</span>():
q =Queue()
threads = []
data = [[<span class="hljs-number">1</span>,<span class="hljs-number">2</span>,<span class="hljs-number">3</span>],[<span class="hljs-number">3</span>,<span class="hljs-number">4</span>,<span class="hljs-number">5</span>],[<span class="hljs-number">4</span>,<span class="hljs-number">4</span>,<span class="hljs-number">4</span>],[<span class="hljs-number">5</span>,<span class="hljs-number">5</span>,<span class="hljs-number">5</span>]]
<span class="hljs-keyword">for</span> i <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">4</span>):
t = threading.Thread(target=job,args=(data[i],q))
t.start()
threads.append(t)
<span class="hljs-keyword">for</span> thread <span class="hljs-keyword">in</span> threads:
thread.join()
results = []
<span class="hljs-keyword">for</span> _ <span class="hljs-keyword">in</span> <span class="hljs-built_in">range</span>(<span class="hljs-number">4</span>):
results.append(q.get())
<span class="hljs-built_in">print</span>(results)
<span class="hljs-keyword">if</span> __name__==<span class="hljs-string">'__main__'</span>:
multithreading()
</code></div></pre>
<h3><a id="4__117"></a>4. 需求:主线程跑的时候,再开启个子线程,无需子线程的结果,相互独立</h3>
<pre><div class="hljs"><code class="lang-python">
<span class="hljs-keyword">import</span> threading, time
<span class="hljs-keyword">def</span> <span class="hljs-title function_">T1</span>():
time.sleep(<span class="hljs-number">3</span>)
<span class="hljs-built_in">print</span>(<span class="hljs-number">666</span>)
<span class="hljs-keyword">def</span> <span class="hljs-title function_">main</span>():
<span class="hljs-comment"># 添加线程</span>
thread = threading.Thread(target=T1, name=<span class="hljs-string">'T1'</span>)
thread.start()
<span class="hljs-built_in">print</span>(<span class="hljs-number">123</span>)
<span class="hljs-keyword">return</span> <span class="hljs-string">'6'</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">'__main__'</span>:
main()
</code></div></pre>
<p>参考:<br />
https://blog.csdn.net/qq_16481211/article/details/80950979</p>
留言