1. process
进程
- 进程是正在运行的程序的实例
- 操作系统利用进程把工作划分为一些功能单元
- 操作系统加载程序,以进程的方式在操作系统中运行它,并分配了系统资源给进程(内存等)
2.
thread
线程 - 进程中所包含的一个或多个执行单元称为线程(thread),线程是 CPU 调度和执行的基本单位
- 操作系统创建一个进程后,该进程会有一个主线程,主线程退出进程就会退出,并释放进程占用的资源
- 一个线程可以创建另一个线程,同一个进程中的多个线程之间可以并发执行
3.
python
多线程 python
带有threading
库,支持开发多线程程序threads = list() for course in d: course_id = course['courseId'] recruit_id = course['recruitId'] if course['courseName'] == course_name: p = {'recruitId': recruit_id, 'courseId': course_id, 'userId': u} chapter_list = post('/bb/gg/ss', p)['chapterList'] studied = post('/bb/aa/ss', p)['aa'] for chapter in chapter_list: for lesson in chapter['lessonList']: if lesson['sectionList'] is not None: for section in lesson['sectionList']: threads.append(threading.Thread(target=save_record, args=[section, lesson, True, studied, user, course])) else: threads.append(threading.Thread(target=save_record, args=[section, lesson, True, studied, user, course])) # 开始执行线程 [threads.start() for thr in thrs] # 等待线程结束 [threads.join() for thr in thrs] return 'ok'
4. python
多进程
Unix/Linux
操作系统提供了一个fork()
系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()
调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。- 子进程永远返回0,而父进程返回子进程的
ID
。这样做的理由是,一个父进程可以fork
出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()
就可以拿到父进程的ID
。 Python
的os
模块封装了常见的系统调用,其中就包括fork
。Windows
没有fork
调用,Mac
系统是基于BSD(Unix的一种)
内核在Mac
下可以运行fork
- 由于
Windows
没有fork
调用,难道在Windows
上无法用Python
编写多进程的程序?由于Python是跨平台的,自然也应该提供一个跨平台的多进程支持。multiprocessing
模块就是跨平台版本的多进程模块。 - 如果要启动大量的子进程,可以用进程池的方式批量创建子进程
# 同时跑10个进程 # 由于Pool的默认大小是CPU的核数,如果你不幸拥有8核CPU,你要提交至少9个子进程才能看到等待效果 progress = Pool(10) for course in d: course_id = course['courseId'] recruit_id = course['recruitId'] if course['courseName'] == course_name: p = {'recruitId': recruit_id, 'courseId': course_id, 'userId': u} chapter_list = post('/aa/course/bb', p)['tt'] studied = post('/aa/ss/bb', p)['ss'] for chapter in chapter_list: for lesson in chapter['lessonList']: if lesson['hh'] is not None: for section in lesson['sectionList']: progress.apply_async(save_record, args=(section, lesson, True, studied, user, course)) else: progress.apply_async(save_record, args=(lesson, lesson, True, studied, user, course)) # 对Pool对象调用join()方法会等待所有子进程执行完毕 # 调用join()之前必须先调用close() # 调用close()之后就不能继续添加新的Process了 progress.close() progress.join()