Python实现多任务(1)#
线程
在远古时代,大多都是单核CPU,想要完成多任务,采用的方式是时间片轮转。简单地说就是任务轮换,比如两个任务,分别让他们执行0.001秒。
通过threading模块完成多线程
import time
import threading
def sing():
for i in range(5):
print("* * *singing* * *")
time.sleep(1)
def dance():
for i in range(5):
print("* * *dancing* * *")
time.sleep(1)
def start_thread():
target1 = threading.Thread(target=sing)
target2 = threading.Thread(target=dance)
target1.start() #创建线程
target2.start()
while True:
length = len(threading.enumerate())
print("当前线程数:%d " % length)
if length <= 1:
break
time.sleep(0.5 )
if __name__ == '__main__':
start_thread()
由于线程共享全局变量,在外部定义全局变量时,就会出现多个线程抢占资源的问题,这时候就需要对单个线程上锁,在执行操作前上锁。
import threading
import time
#全局变量 线程之间容易出现资源竞争
g_num = 0
def test1(nums):
global g_num
#如果没有上锁则成功,如果已上锁则阻塞
for i in range(nums):
mutex.acquire()
g_num += 1
mutex.release()
print("这是 线程1 的 num = %s " % str(g_num))
def test2(nums):
global g_num
for i in range(nums):
mutex.acquire()
g_num += 1
mutex.release()
print("这是 线程2 的 num = %s " % str(g_num))
mutex = threading.Lock()
def main():
t1 = threading.Thread(target=test1, args=(1000000,))
t2 = threading.Thread(target=test2, args=(1000000,))
t1.start()
t2.start()
time.sleep(3)
print("这是 主线程的 num = %s "% str(g_num))
if __name__ == '__main__':
main()