Python多线程同步输出1-100的数

一、多线程是什么

我们的程序默认只有一个进程,进程中有一个主线程,但是有个时候我们进行多个任务同时工作的时候就会> 发生任务不同步的问题,因为只有一个主线程,而主线程同时只能完成一个任务,所以下一个任务就会等待> 上一个任务完成后才能继续运行。

代码如下:

def print_num():
		while True:
			print(1)
	
def print_str():
	while True:
		print(2)

if __name__ == '__main__':
	print_num()
	print_str()

像上述代码一样,因为只有一个主线程的原因,所以只能等待print_num()函数的任务结束后才能继续执行print_str()函数,这样就会造成我们的效率低下的问题。
这里主要是讲述多线程同步输出数字,所以其他多线程理论就不再作过多的解释了,可以自行百度一下。

二、threading模块

threading模块是_thread模块的升级版,在_thread模块上做了很多的修改和优化,可以说是一个很不错的多线程模块了,所以本篇使用threading来做多线程的演示。

Thread:生成一个新的线程,对上面的代码进行多线程运行
import threading
def print_num():
		while True:
			print(1)
	
def print_str():
	while True:
		print(2)

if __name__ == '__main__':
	t1 = threading.Thread(target=print_num,args=())	#target是指定函数(不要带括号),args是函数的参数(如果没有参数可以省略不写)
	t2 = threading.Thread(target=print_str,args=())	#上面是print_num的线程,下面是print_str的线程
	t1.start()	#运行t1线程
	t2.start()	#运行t2线程

输出结果:
1
2
2
1
1
1
1
2

提示:输出结果的顺序是看谁运行速度的快慢决定的,你可以用time.sleep来拖慢某个线程的运行速度,以此更鲜明的看出对比

Lock:将数据加一把锁,数据正在被操作时其他线程等待数据操作完毕后才会进行操作
import threading
def worker():
    global count
    while True:
        lock.acquire()	#加锁
        count += 1
        print(threading.current_thread(),count)
        lock.release()	#操作完成后释放锁
        if count >= 99:
            break
        time.sleep(1)
    print(1)

def main():
    threads = []
    for i in range(2):	#控制线程的数量
        t = threading.Thread(target=worker,args=())
        threads.append(t)
    for i in threads:
        i.start()
    for i in threads:
        i.join()	#将线程加入到主线程中

if __name__ == '__main__':
    lock = threading.Lock()
    count = 0
    main()

输出结果:
1
2
3
4
5
6

100

这样就完成了多个线程来使数据相加。

你可能感兴趣的:(Python)