在代码需求中有一些让几件事同时进行操作的:
一般代码中有一个主线程,:
线程访问全局变量:
import threading #导入这个模块
这个模块中有一个threading.Thread(target= 函数名,args=(方法参数))
然后在有一个接受对象就完成一个线程了
但是有几个线程同时操作一个全局变量是会很容造成线程的安全问题 这个时候就需要线程锁了
线程所就是只能有一个线程可以执行这个线程其他的线程只能在
threading.Lock(),acquire()之前等待必须要等到
threading.Lock().release()这个执行过后才会让另一个线程执行
这样的话就可以报证这个全局变量的正确操作
线程之间的通信:
Queue是一个先进先出的队列 将一个值存储在 Queue中使用queue.put(存储的内容) 然后在另一个线程中可以调用queue.get()方法来取出值 取值的顺序是和存储值时的顺序一样
进程
一个程序运行时代码用到的资源称之为进程,进程也是可以完成多任务的 和线程有些类似但是进程的范围要比线程的大
一个程序必须要有一个主进程一个主线程 其他的线程或者进程在主线程或者主进程中创建
创建一个进程的方式时:
import multiprocessing
x = multiprocessing.Process(target = 方法名(注意不要带括号)) # 否则就是调用这个方法了
注意 :并不是进程越多越好 因为电脑cpu能够同时执行的进程是有限的
进程中也有通信Queue 但是和线程中的不一样
导入的是 import multiprocessing # 中的Queue
作用和线程中的相似
进程池
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会用之前的进程来执行新的任务