线程的创建 和线程池的创建
1.没有创建线程
#coding:utf-8
import time
import os
import multiprocessing
import json
import random
lists = ['C','C++','Qt','Python','Shell','Socket',
'MySQL','Linux','Camera']
new_lists=[]
def work():
if len(lists) == 0:
return
data = random.choice(lists)
lists.remove(data)
new_data = '%s_new' % data
new_lists.append(new_data)
time.sleep(1)
if __name__ == '__main__':
start = time.time()
for i in range(len(lists)):
work()
print('old list:',lists)
print('new list:',new_lists)
print('time is %s' % (time.time() - start)) # 9.07205867767334
2.创建线程
#coding:utf-8
import time
import os
import multiprocessing
import json
import random
import threading
lists = ['C','C++','Qt','Python','Shell','Socket',
'MySQL','Linux','Camera']
new_lists=[]
def work():
if len(lists) == 0:
return
data = random.choice(lists)
lists.remove(data)
new_data = '%s_new' % data
new_lists.append(new_data)
time.sleep(1)
if __name__ == '__main__':
start = time.time()
t_list=[]
for i in range(len(lists)):
t = threading.Thread(target=work,args=())
t_list.append(t)
t.start()
for t in t_list:
t.join()
print('old list:',lists)
print('new list:',new_lists)
print('time is %s' % (time.time() - start)) # 1.0072548389434814
线程存在的问题:
1.通过多线程执行的函数无法获取返回值
2.多个线程同时修改文件可能会造成数据错乱
二、线程池的创建
可以看到是2个 2个 一起输出的。
import os
import multiprocessing
import json
import random
import threading
from concurrent.futures import ThreadPoolExecutor
def work(i):
print(i)
time.sleep(1)
if __name__ == '__main__':
t = ThreadPoolExecutor(2)
for i in range(20):
t.submit(work,(i,))
加入线程锁之后,可以看到是一个一个输出的。没有加锁的是,2个2个一起输出的。
import os
import multiprocessing
import json
import random
import threading
from concurrent.futures import ThreadPoolExecutor
lock = threading.Lock()
def work(i):
lock.acquire()
print(i)
time.sleep(1)
lock.release()
if __name__ == '__main__':
t = ThreadPoolExecutor(2)
for i in range(20):
t.submit(work,(i,))
加入线程锁
#coding:utf-8
import time
import os
import multiprocessing
import json
import random
import threading
from concurrent.futures import ThreadPoolExecutor
lock = threading.Lock()
def work(i):
#lock.acquire()
print(i,os.getpid())
time.sleep(1)
#lock.release()
return 'result is %s' % i
if __name__ == '__main__':
print('主进程pid:',os.getpid())
t = ThreadPoolExecutor(2)
result = []
for i in range(20):
t_result=t.submit(work,(i,))
result.append(t_result)
for res in result:
print(res.result())
可以看到,只有一个进程号。这说明在一个进程中,创建多个线程,并行执行。

浙公网安备 33010602011771号