multiprocessing
进程模块。
常用方法
cpu_count():获取当前的电脑的cpu个数。
Process
表示一个进程。
常用方法
start():启动一个进程。
join():等待子进程结束后,再执行父进程。如:
import os
from multiprocessing import Process # Process是跨平台的进程
def fun(*args,**kwargs):
for arg in args:
print(arg) # 依次输出arg1,arg2
for key, value in kwargs.items():
print("key = %s,value = %s" % (key, value)) # 依次输出key = key1,value = value1等
print("process %s-%s" % (os.getpid(), os.getppid()))
# process 6848-7560
if __name__ == '__main__':
print("主进程%s"%os.getpid()) # 主进程7560
p = Process(target=fun, args=('arg1','arg2'),kwargs={'key1':"value1","key2":34})
p.start()
p.join()
print("主进程end") # 最后执行,等所有子进程都结束后才执行
__init__:构造函数。target关键字指向子进程要执行的代码,args是一个元组,指的是向代码中传递的参数,kwargs是一个字典,也是向子进程中传递的参数。
Pool
进程池。
__init__:可以指定缓存的进程的个数。如果获取的进程超过这个个数,则必须等待已有的进程结束后才会获取到新的进程。
apply_async():在子进程中执行指定的代码。参数与Process的构造函数类似,func指向子进行要执行的方法,args,kwds指向传入的参数。
close():关闭进程池,调用后无法向该进程池中传入新进程。
join():进程池中进程都结束后,父进程才会继续执行。必须在close()方法后执行。如:
import os,time,random
from multiprocessing import Pool # Process是跨平台的进程
def f(name):
print("name = %s,pid = %s,ppid = %s" % (name, os.getpid(),os.getppid()))
time.sleep(random.random()*3) # 每一个进程休息一会儿,这样会导致Pool不停地
if __name__ == '__main__':
print(os.getpid())
p = Pool(3)
for x in range(1,6):
p.apply_async(args=(x,),func=f)
p.close()
p.join()
运行时,可以发现先执行三个进程,而且Pid只有三个——因为Pool中的参数指定的是3,它规定了这个进程池中最多只有三个进程,当用完之后必须等某一个进程回收之后才会再次分配出去执行其余的代码。threading
线程模块。
Thread
代表一个线程。
__init__:构造函数。target指该线程要执行的代码,args是传入的参数,name指该线程的名字。
start():启动该线程。
join():等该线程结束后再执行别的代码。这两个方法都与Process类似。
lock
锁,用于线程同步。通过threading模块中的Lock()方法获取一个lock对象。
acquire():为某一段代码加锁,加锁之后该代码一次只能允许一个线程进行访问。
release():释放锁。