VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > Python基础教程 >
  • Python进程、线程、协程详解(9)

一个进程池对象可以控制工作进程池的哪些工作可以被提交,它支持超时和回调的异步结果,有一个类似map的实现。

 

processes :使用的工作进程的数量,如果processes是None那么使用 os.cpu_count()返回的数量。

initializer: 如果initializer是None,那么每一个工作进程在开始的时候会调用initializer(*initargs)。

maxtasksperchild:工作进程退出之前可以完成的任务数,完成后用一个心的工作进程来替代原进程,来让闲置的资源被释放。maxtasksperchild默认是None,意味着只要Pool存在工作进程就会一直存活。

context: 用在制定工作进程启动时的上下文,一般使用 multiprocessing.Pool() 或者一个context对象的Pool()方法来创建一个池,两种方法都适当的设置了context

注意:Pool对象的方法只可以被创建pool的进程所调用。

 

New in version 3.2: maxtasksperchild

New in version 3.4: context

 

进程池的方法

apply(func[, args[, kwds]]) :使用arg和kwds参数调用func函数,结果返回前会一直阻塞,由于这个原因,apply_async()更适合并发执行,另外,func函数仅被pool中的一个进程运行。

 

apply_async(func[, args[, kwds[, callback[, error_callback]]]]) : apply()方法的一个变体,会返回一个结果对象。如果callback被指定,那么callback可以接收一个参数然后被调用,当结果准备好回调时会调用callback,调用失败时,则用error_callback替换callback。 Callbacks应被立即完成,否则处理结果的线程会被阻塞。

 

close() : 阻止更多的任务提交到pool,待任务完成后,工作进程会退出。

 

terminate() : 不管任务是否完成,立即停止工作进程。在对pool对象进程垃圾回收的时候,会立即调用terminate()。

 

join() : wait工作线程的退出,在调用join()前,必须调用close() or terminate()。这样是因为被终止的进程需要被父进程调用wait(join等价与wait),否则进程会成为僵尸进程。

 

map(func, iterable[, chunksize])¶

 

map_async(func, iterable[, chunksize[, callback[, error_callback]]])¶

 

imap(func, iterable[, chunksize])¶

 

imap_unordered(func, iterable[, chunksize])

 

starmap(func, iterable[, chunksize])¶

 

starmap_async(func, iterable[, chunksize[, callback[, error_back]]])

 

python 协程

 

线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。

 

协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。

 

协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程;

 

event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们。

 

event loop提供了如下的特性:

 

注册、执行、取消延时调用(异步函数)

创建用于通信的client和server协议(工具)

创建和别的程序通信的子进程和协议(工具)

把函数调用送入线程池中

协程示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
import asyncio
  
async def cor1():
    print("COR1 start")
    await cor2()
    print("COR1 end")
  
async def cor2():
    print("COR2")
  
loop = asyncio.get_event_loop()
loop.run_until_complete(cor1())
loop.close()

最后三行是重点。

 

asyncio.get_event_loop()  : asyncio启动默认的event loop 

run_until_complete()  :  这个函数是阻塞执行的,知道所有的异步函数执行完成,

close()  :  关闭event loop。

1、greenlet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import greenlet
def fun1():
    print("12")
    gr2.switch()
    print("56")
    gr2.switch()
 
def fun2():
    print("34")
    gr1.switch()
    print("78")
 
 
gr1 = greenlet.greenlet(fun1)
gr2 = greenlet.greenlet(fun2)
gr1.switch()

相关教程