Python0016多线程

Python0016多线程


1.多线程简介

现代的高级编程语言中,几乎所有语言都支持多线程。多线程很实用,即便是在单核处理器上多线程仍然是实用的。

在安卓开发中,安卓系统强制一个线程处理图形界面,其他线程处理逻辑。这样的好处是用户图形界面流畅。IOS开发,C#桌面应用程序中也是如此的。曾经写安卓代码阻塞过UI线程,在手机上的效果是:系统弹出一个提示框XXXX没有响应。通常情况下,手机app出现类似的提示,都是因为开发人员在UI线程中进行了大量的运算导致的,这样做用户体验非常差。

在基于多核心多线程CPU的图像视频处理程序中,由于要进行大量的运算,通常使用多线程来处理,可以达到缩短运行时间的效果。如果在单核单线程一个处理器的机器上,多线程不能缩短执行时间,而且还能增加执行时间。

使用多线程过程中问题也很多,多个线程间是共享数据的,这时候会出现线程安全问题。假设a,b线程共同使用变量sum。a中执行的是sum=0 sum=1+2  print sum,b中执行sum=1 sum=3+4 print sum。由于a,b两个线程共同执行,那么这六条语句有多种执行顺序,下面列举两种:

(1)正常

a: sum=0

a: sum=1+2

a: print sum  #输出3

b: sum=1

b: sum=3+4

b: print sum #输出7

(2)异常

b: sum=1

b: sum=3+4

a: sum=0

a: sum=1+2

b: print sum #输出3

a: print sum #输出3

出现这种问题后,就要用到线程锁,线程同步机制等。当同时使用多个线程锁时还可能出现死锁。




2.python中的多线程

在python中有两种创建线程的方式:

(1)写一个要再子线程中执行的函数,传给Thread类

import threading
import time
#把函数传给Thread
def print_number(number):
    #下面一行是为了让结果看起来更自然,让线程休眠100ms,可以去掉
    time.sleep(0.1)
    print("thread_id:",threading.current_thread().ident,"  num:",number)

threads=[]

#下面创建了10个线程
for i in range(10):
    #target 要执行的函数   args 要执行函数的参数   注意:(i,)最后一个参数一定要这样写,否则会有问题,具体原因还没有探究
    t=threading.Thread(target=print_number,args=(i,))
    threads.append(t)

#启动线程
for t in threads:
    t.start()

# 某次运行结果:
# thread_id: 123145321340928   num: 0
# thread_id: 123145331851264   num: 2
# thread_id: 123145326596096   num: 1
# thread_id: 123145337106432   num: 3
# thread_id: 123145342361600   num: 4
# thread_id: 123145368637440   num: 9
# thread_id: 123145358127104   num: 7
# thread_id: 123145347616768   num: 5
# thread_id: 123145363382272   num: 8
# thread_id: 123145352871936   num: 6


(2)继承Thread类,重写run方法

import threading
import time

#继承Thread对象,重写run方法
class PrintNumThread(threading.Thread):
    def __init__(self,number):
        super(PrintNumThread,self).__init__()
        self.number=number
    def run(self):
        #下面一行是为了让结果看起来更自然,让线程休眠100ms,可以去掉
        time.sleep(0.1)
        print("thread_id:",threading.current_thread().ident,"  num:",self.number)

threads=[]

#下面创建了10个线程
for i in range(10):
    threads.append(PrintNumThread(i))

#启动这10个线程
for t in threads:
    t.start()


# 某次运行结果:
# thread_id: 123145426317312   num: 0
# thread_id: 123145431572480   num: 1
# thread_id: 123145436827648   num: 2
# thread_id: 123145447337984   num: 4
# thread_id: 123145452593152   num: 5
# thread_id: 123145463103488   num: 7
# thread_id: 123145442082816   num: 3
# thread_id: 123145457848320   num: 6
# thread_id: 123145468358656   num: 8
# thread_id: 123145473613824   num: 9

猜你喜欢

转载自blog.csdn.net/moluth/article/details/79380413
今日推荐