01创建线程方式1
import threading
import time
def loop ( ) :
print ( threading. currentThread( ) . getName( ) )
n = 0
while n < 5 :
print ( n)
time. sleep( 1 )
n += 1
def use_thread ( ) :
print ( threading. currentThread( ) . name)
t = threading. Thread( target= loop, name= "now_thread_loop" )
t. start( )
print ( "xxx" )
if __name__ == '__main__' :
use_thread( )
01创建线程方式2
import threading
import time
class myThread ( threading. Thread) :
def run ( self) :
n = 0
while n < 5 :
print ( "当前异步线程的名称是[{0}]" . format ( threading. currentThread( ) . getName( ) ) )
print ( n)
time. sleep( 0.5 )
n += 1
if __name__ == '__main__' :
t= myThread( name= "async thread 1" )
t. start( )
print ( "当前主线程的名称是:[{}]" . format ( threading. currentThread( ) . getName( ) ) )
03多线程并发问题
import threading
"""
测试在没有线程锁的情况下 多线程共同操作同一变量时出现的问题
"""
balance = 0
def change_it ( n) :
global balance
balance = balance + n
balance = balance - n
if balance != 0 :
print ( "当前线程[{0}] balance为[{1}]" . format ( threading. currentThread( ) . getName( ) , balance) )
class changeItClass ( threading. Thread) :
def __init__ ( self, num, * args, ** kwargs) :
super ( ) . __init__( * args, ** kwargs)
self. num = num
def run ( self) :
for i in range ( 10000000 ) :
change_it( self. num)
if __name__ == '__main__' :
c1 = changeItClass( num= 5 , name= "aa11" )
c2 = changeItClass( num= 8 , name= "aa22" )
c3 = changeItClass( num= 12 , name= "aa22" )
c1. start( )
c2. start( )
c3. start( )
04多线程并发问题解决
import threading
"""
测试在没有线程锁的情况下 多线程共同操作同一变量时出现的问题
"""
lock1 = threading. Lock( )
rlock2 = threading. RLock( )
balance = 0
def change_it ( n) :
global balance
print ( "11111" )
rlock2. acquire( )
rlock2. acquire( )
print ( "2222222" )
balance = balance + n
balance = balance - n
if balance != 0 :
print ( "当前线程[{0}] balance为[{1}]" . format ( threading. currentThread( ) . getName( ) , balance) )
print ( "3333333" )
rlock2. release( )
rlock2. release( )
class changeItClass ( threading. Thread) :
def __init__ ( self, num, * args, ** kwargs) :
super ( ) . __init__( * args, ** kwargs)
self. num = num
def run ( self) :
for i in range ( 10000000 ) :
change_it( self. num)
if __name__ == '__main__' :
c1 = changeItClass( num= 5 , name= "aa11" )
c2 = changeItClass( num= 8 , name= "aa22" )
c3 = changeItClass( num= 12 , name= "aa22" )
c1. start( )
c2. start( )
c3. start( )
05使用线程池
import threading
import os
from concurrent. futures. thread import ThreadPoolExecutor
"""
使用线程池 适用对需要使用多个线程运行的业务
通过ThreadPoolExecutor 创建线程池
相关文档:https://docs.python.org/zh-cn/3/library/concurrent.futures.html
"""
lock1 = threading. Lock( )
rlock2 = threading. RLock( )
balance = 0
def change_it ( n) :
global balance
print ( "2222222" )
balance = balance + n
balance = balance - n
if balance != 0 :
print ( "当前线程[{0}] balance为[{1}]" . format ( threading. currentThread( ) . getName( ) , balance) )
print ( "3333333" )
class changeItClass ( threading. Thread) :
def __init__ ( self, num, * args, ** kwargs) :
super ( ) . __init__( * args, ** kwargs)
self. num = num
def run ( self) :
for i in range ( 10000000 ) :
change_it( self. num)
if __name__ == '__main__' :
threadPool= ThreadPoolExecutor( max_workers= os. cpu_count( ) * 5 )
threadPool. map ( change_it, range ( 1000000 ) )