多线程

并发:任务数多于CPU核数时
并行:任务数小于CPU核数时

线程:
使用threading模块使用线程
import threading
线程名 = threading.Thread(target = 函数名)
线程名.start()

主线程会等待所有子线程结束后才结束

如果需求时让主线程不等待某个子线程结束就立即结束,
解决方法是主线程守护
线程名.setDaemon(True)
例:

import threading, time

def work(num):
for i in range(num):
print("work...")
time.sleep(0.1)

if __name__ == '__main__':
work_thread = threading.Thread(target=work, args=(10,))
# 需求:不管子线程的任务是否执行完成 只有主线程的任务执行完程序就结束
# 解决方案:子线程名.setDaemon(True)
work_thread.setDaemon(True)
work_thread.start()
print("测试")

 

线程传参的两种方法:
1.args
线程名 = threading.Thread(target = 函数名, args =(变量1,变量2...))
2.kwargs
线程名 = threading.Thread(target = 函数名, kwargs = {"变量名1":实参1,"变量名2":实参2})

查看当前线程
threading.current_thead()
查看运行的线程列表
threading.enumerate()
查看程序中有几个线程在工作
1. len(threading.enumerate())
2. threading.active_count()

多线程全局变量问题点:资源争夺问题

import threading
num = 0
def work1(a):
global num
for i in range(1000000):
num += 1
print("work1:", num)

def work2(a):
global num
for i in range(1000000):
num += 1
print("work2:", num)

if __name__ == '__main__':
work1_thread = threading.Thread(target=work1)
work2_thread = threading.Thread(target=work2)
work1_thread.start()
work2_thread.start()

 


结果:
work2: 1193318
work1: 1230812

原因:work1大于1000000是因为累加时work2也会进行累加
work2小于2000000是因为在累加时work1和work2有可能返回同一个值

解决方案:线程同步
先执行的线程名.join()
代码:

import threading
num = 0
def work1():
global num
for i in range(1000000):
num += 1
print("work1:", num)

def work2():
global num
for i in range(1000000):
num += 1
print("work2:", num)

if __name__ == '__main__':
work1_thread = threading.Thread(target=work1)
work2_thread = threading.Thread(target=work2)
work1_thread.start()
work1_thread.join()
work2_thread.start()

 

自定义线程:
线程默认只能执行一个任务,自定义线程就是将多个函数用一个函数调用,线程只完成这一个函数就完成了多个任务。

posted @ 2018-04-14 20:20  zcznb11  阅读(81)  评论(0编辑  收藏  举报