线程的创建 和线程池的创建

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())

可以看到,只有一个进程号。这说明在一个进程中,创建多个线程,并行执行。

posted @ 2022-12-17 12:08  repinkply  阅读(27)  评论(0)    收藏  举报