我们的程序默认只有一个进程,进程中有一个主线程,但是有个时候我们进行多个任务同时工作的时候就会> 发生任务不同步的问题,因为只有一个主线程,而主线程同时只能完成一个任务,所以下一个任务就会等待> 上一个任务完成后才能继续运行。
代码如下:
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模块是_thread模块的升级版,在_thread模块上做了很多的修改和优化,可以说是一个很不错的多线程模块了,所以本篇使用threading来做多线程的演示。
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来拖慢某个线程的运行速度,以此更鲜明的看出对比
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
这样就完成了多个线程来使数据相加。