python_并发编程——多线程

Posted 手可摘星辰。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python_并发编程——多线程相关的知识,希望对你有一定的参考价值。

1.多线程并发

from threading import Thread
import time

def func(n):
    time.sleep(1)
    print(n)

for i in range(10):
    t = Thread(target=func,args=(i,))   #将函数注册进子线程,并传递参数
    t.start()   #启动子线程

结果:

 

 2.另外一种启动多线程的方法

from threading import Thread
import time

class MyTread(Thread):
    def __init__(self,arg):     #接收参数
        super().__init__()
        self.arg = arg

    def run(self):  #子线程要执行的内容
        time.sleep(1)
        print(self.arg)

for i in range(10):
    t = MyTread(i)  #实例化子线程+传递参数
    t.start()   #启动子线程

结果:

 

 3.查看多线程是否都在同一个进程里面

from threading import Thread
import time
import os

class MyTread(Thread):
    def __init__(self,arg):     #接收参数
        super().__init__()
        self.arg = arg

    def run(self):  #子线程要执行的内容
        time.sleep(1)
        print(self.arg,os.getpid())

for i in range(10):
    t = MyTread(i)  #实例化子线程+传递参数
    t.start()   #启动子线程
print(\'主线程:\',os.getpid())

结果: 相同的进程编号,说明所有的线程都在同一个进程里面。

4.线程之间数据共享

from threading import Thread
import time

ggg = 100

def func(n):
    time.sleep(1)
    global ggg
    ggg = 0
    print(\'子线程:\',n)


t_list = []
for i in range(10):
    t = Thread(target=func,args=(i,))
    t.start()
    t_list.append(t)
for i in t_list:
    i.join()
print(\'主线程:\',ggg)

结果: 全局变量ggg本来是100,在子线程中被改成了0。

5.查看线程名字和线程ID

import threading

def func(n):
    print(n)
        #打印线程名字和ID
    print(threading.current_thread())
        #打印线程ID
    print(threading.get_ident())

threading.Thread(target=func,args=(1,)).start()
print(threading.current_thread())

结果:

 6.查看当前存活的线程数量和线程对象

import threading
import time

def func(n):
    time.sleep(1)
    print(threading.current_thread())

for i in range(10):
    threading.Thread(target=func,args=(i,)).start()
#查看当前存活的线程数量
print(threading.active_count())
#查看当前存活的线程对象
print(threading.enumerate())

结果:

7.守护线程

import time
from threading import Thread

def func1():
    time.sleep(10)
    print(\'子线程!\')

t = Thread(target=func1)
t.start()
print(\'主线程!\')

结果:主线程会等待10秒后,子线程结束时在结束。

import time
from threading import Thread

def func1():
    time.sleep(10)
    print(\'子线程!\')

t = Thread(target=func1)
t.daemon = True     #将子线程设为守护线程
t.start()
print(\'主线程!\')

结果:当只有一个守护线程时,主线程结束时,守护线程随即结束。

import time
from threading import Thread

def func1():
    while True:
        print(\'*\'*10)
        time.sleep(1)
def func2():
    time.sleep(5)
    print(\'func2结束!\')

t1 = Thread(target=func1)
t1.daemon = True     #将子线程设为守护线程
t1.start()
t2 = Thread(target=func2)
t2.start()
print(\'主线程!\')

结果:守护线程和守护进程不一样,守护进程随着主进程的代码的执行结束而结束,守护线程会在主线程结束之后等待其他子线程的结束才结束。

 

 8.join()方法

import time
from threading import Thread

def func1():
    while True:
        print(\'*\'*10)
        time.sleep(1)
def func2():
    time.sleep(5)
    print(\'func2结束!\')

t1 = Thread(target=func1)
t1.daemon = True     #将子线程设为守护线程
t1.start()
t2 = Thread(target=func2)
t2.start()
t2.join()   #先阻塞主线程,专注于执行子线程,等子线程执行完毕后,在执行主线程
print(\'主线程!\')

结果:

以上是关于python_并发编程——多线程的主要内容,如果未能解决你的问题,请参考以下文章

python并发编程之多线程

python 学习_第四模块 并发编程(多线程)

python并发编程:多线程-开启线程的两种方式

python学习_day36_并发编程之多线程1

python中的多线程和多进程编程

python 复习—并发编程实战——线程多进程多协程加速程序运行实例(多线程和多进程的对比)