进程和线程python
既然看到这一章,那么你确定知道如今的系统都是支持“多任务”的操做,好比: Mac OS X,UNIX,Linux,Windows等。git
多任务:简单地说就是同时运行多个任务。譬如:你能够一边看小电影,一边用word写感觉,在一边录制,这就是多任务,至少同时有3个任务正在运行。还有不少任务在后台运行,只是桌面上没有显示而已。程序员
如今,多核CPU已经很广泛了,可是,即便在过去单核的时代,也是能够执行多任务的。因为CPU执行代码都是顺序执行的,那么单核CPU是怎么执行多任务的呢?答案就是:操做系统轮流让各个任务交替执行,任务1执行0.01秒,任务2执行0.01秒,在切换到任务3上......这样反复下去。表面看都是交替执行的,可是,CPU的执行速度太快,因此咱们感受就像全部任务都在同时执行同样。github
真正的同时执行多任务只能在多核CPU上实现,可是,任务数量远远多于CPU的核心数量,因此操做系统也会自动把不少任务轮流调度到每一个核心上执行。算法
对于操做系统来讲,一个任务就是一个进程(Process)有些进程还不止同时干一件事,好比word,它能够同时进行打字、拼写检查,打印等事情 。在一个进程内部,要同时干多件事,因此,一个进程至少有一个线程。固然,像word这种复杂的进程能够有多个线程,多个线程能够同时执行,多线程的执行方式和多进程是同样的,也是由操做系统在多个线程以前快速的切换,让每个线程都在短暂地交替运行,看起来就像同时执行同样。固然,真正地同时支持多线程须要多核CPU才可能实现。编程
前面写的全部Python程序,都是执行单任务的进程,也就是只有一个线程。若是要同时执行多个任务,请继续往下看。服务器
有两种解决方案:多线程
一种是启动多个进程,每一个进程虽然只有一个线程,但多个进程能够一块执行多个任务。并发
还有一种方法是启动一个进程,在一个进程内启动多个线程,这样,多个线程也能够一块执行多个任务。app
第三个方法就是启动多个进程,每一个进程在启动多个线程,这样同时执行的任务就更多了,固然这中模型更复杂,实际不多采用。
总结如下就是,多任务的实现有3种方式:
同时支持多个任务一般各个任务之间并非没有关联的,二是须要相互通讯和协调,有时,任务1必须暂停等待任务2完成才能继续执行,有时,任务3和任务4又不能同时执行,因此,多进程和多线程的程序的复杂度要远远高于咱们前面写的单进程单线程的程序。
由于复杂度高,调试困难,因此,不是无可奈何,咱们也不想编写多任务。可是,有不少时候,没有多任务还真不行。Python既支持多进程,又支持多线程,咱们会讨论如何编写这两种多任务程序。
要让Python程序实现多进程,咱们要先了解一些操做系统的相关知识。
Unix/Linux操做系统提供了一个fork()系统调用,它很是特殊。普通的函数调用,调用一次,返回一次,可是fork()调用一次,返回两次,由于操做系统自动把当前进程(称为父进程)复制了一份(称为子进程),而后,分别在父进程和子进程内返回。
子进程永远返回0,而父进程返回子进程的ID。这样作的理由是,一个父进程能够fork出不少子进程,因此,父进程要记下每个子进程的ID,而子进程只须要调用getppid()就能够拿到父进程的ID。
Python的os模块封装了常见的系统调用,其中就包括fork,能够在Python程序中轻松建立子进程:
import os
print(
'
Process (%s) start...
' % os.getpid())
#
Only works on Unix/Linux/Mac:
pid = os.fork()
if pid == 0:
print(
'
I am child process (%s) and my parent is %s.
' % (os.getpid(), os.getppid()))
else:
print(
'
I (%s) just created a child process (%s).
' % (os.getpid(), pid))
运行结果以下:
Process (876) start...
I (876) just created a child process (877).
I am child process (877)
and my parent
is 876.
因为Windows没有fork调用,上面的代码不能在Windows上运行。因为Mac系统是基于BSD(Unix的一种)内核,因此,在Mac下运行是没有问题的,推荐是用Mac下学习Python!
有了fork调用,一个进程在接到新任务时就能够复制出一个子进程来处理新任务,常见才Apache服务器就是由附近吃监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。
multiprocessing
from multiprocessing import Process, Queue
import os, time, random, threading
def fool(i):
print
'
say hi
',i
if __name__ ==
'
__main__
':
for i
in range(
1000):
i = Queue()
p = Process(target=fool,args=(i,))
p.start()
执行结果:
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hisay hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0><multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hisay hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
<multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023752B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023052B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023452B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022D52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023C52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023352B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023252B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022F52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023852B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023552B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000024152B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023A52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023952B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000022B52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023E52B0>
say hi <multiprocessing.queues.Queue
object at
0x00000000023652B0>
View Code
若是你打算编写多进程的服务程序,Unix/Linux无疑是正确的选择。因为Windows没有fork调用,而Python是跨平台的,天然应该提供一个跨平台的多进程支持。multiprocessing模块就是跨平台版本的多进程模块。
multiprocessing模块提供了一个process类来表明一个进程对象,下面的例子演示了启动一个子进程并等待其结束:
#
!/usr/bin/env python
#
--*--coding:utf-8 --*--
from multiprocessing
import Process
import os
#
子进程要执行的代码
def run_proc(name):
print(
'
Run child process %s (%s)...
' % (name, os.getpid()))
if
__name__==
'
__main__
':
print(
'
Parent process %s.
' % os.getpid())
p = Process(target=run_proc, args=(
'
test
',))
print(
'
Child process will start.
')
p.start()
p.join()
print(
'
Child process end.
')
执行结果以下:
Parent process 8608.
Child process will start.
Run child process test (8752)...
Child process end.
建立子进程时,只须要传入一个执行函数和函数的参数,建立一个process实例,用start()方法启动,这样建立进程比fork()还要简单。
join()方法能够等待子进程结束后再继续往下运行,一般用于进程间的同步。
POOL
若是要启动大量的子进程,能够用进程池的方式批量建立子进程:
#
!/usr/bin/env python
#
--*--coding:utf-8 --*--
from multiprocessing
import Pool
import os, time, random
def long_time_task(name):
print(
'
Run task %s (%s)...
' % (name, os.getpid()))
start = time.time()
time.sleep(random.random() * 3)
end = time.time()
print(
'
Task %s runs %0.2f seconds.
' % (name, (end - start)))
if
__name__==
'
__main__
':
print(
'
Parent process %s.
' % os.getpid())
p = Pool(4)
for i
in range(5):
p.apply_async(long_time_task, args=(i,))
print(
'
Waiting for all subprocesses done...
')
p.close()
p.join()
print(
'
All subprocesses done.
')
执行结果:
Parent process 9052.
Waiting
for all subprocesses done...
Run task 0 (7832)...
Run task 1 (8388)...
Run task 2 (8224)...
Run task 3 (9272)...
Task 1 runs 1.00 seconds.
Run task 4 (8388)...
Task 2 runs 1.19 seconds.
Task 0 runs 1.85 seconds.
Task 3 runs 2.01 seconds.
Task 4 runs 1.65 seconds.
All subprocesses done.
执行结果
代码解读:
对Pool对象调用join()方法会等待全部子进程执行完毕,调用join()以前必须先调用close(),调用close()以后就不能继续添加新的Process了。
请注意输出的结果,task 0,1,2,3是当即执行的,而task4是要等待前面某个task完成后才执行,这是由于pool的默认大小在个人电脑是上4,所以,最多同时执行4个进程。这是pool有意设计的限制,并非操做系统的限制。若是改为:
就能够同时跑5个进程。
因为Pool的默认大小是CPU的核数,若是你的电脑拥有8核CPU,你要提交至少9个子进程才能看到上面的等待效果。
子进程
不少时候,子进程并非自身,二是一个外部进程。咱们建立了子进程后,还须要控制子进程的输入和输出。
subprocess模块可让咱们很是方便地启动一个子进程,而后控制其输入输出。
下面的例子演示了如何在Python代码中运行命令nslookup www.python.org,这和命令知己运行的效果是同样的:
#
!/usr/bin/env python
#
--*--coding:utf-8 --*--
import subprocess
print('$ nslookup www.python.org')
r = subprocess.call(['nslookup', 'www.python.org'])
print('Exit code:', r)
运行结果:
$ nslookup www.python.org
Server: 192.168.19.4
Address: 192.168.19.4
#
53
Non-authoritative answer:
www.python.org canonical name = python.map.fastly.net.
Name: python.map.fastly.net
Address: 199.27.79.223
Exit code: 0
若是子进程还须要输入,则能够经过communicate()方法输入:
import subprocess
print(
'
$ nslookup
')
p = subprocess.Popen([
'
nslookup
'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b
'
set q=mx\npython.org\nexit\n
')
print(output.decode(
'
utf-8
'))
print(
'
Exit code:
', p.returncode)
上面的代码至关于在命令执行nslookup,而后手动输入:
运行结果以下:
$ nslookup
Server: 192.168.19.4
Address: 192.168.19.4
#
53
Non-authoritative answer:
python.org mail exchanger = 50 mail.python.org.
Authoritative answers can be found
from:
mail.python.org internet address = 82.94.164.166
mail.python.org has AAAA address 2001:888:2000:d::a6
Exit code: 0
进程间通讯
Process之间确定是须要通讯的,操做系统提供了不少机制来实现进程间的通讯。Python的multiprocessing模块包装了底层的机制,提供看Queue、Pipes等多种方式来交换数据。
咱们以Queue为例,在父进程中建立两个子进程,一个往Queue里写数据,一个从Queue里读数据:
#
!/usr/bin/env python
#
--*--coding:utf-8 --*--
from multiprocessing
import Process, Queue
import os, time, random
#
写数据进程执行的代码:
def write(q):
print(
'
Process to write: %s
' % os.getpid())
for value
in [
'
A
',
'
B
',
'
C
']:
print(
'
Put %s to queue...
' % value)
q.put(value)
time.sleep(random.random())
#
读数据进程执行的代码:
def read(q):
print(
'
Process to read: %s
' % os.getpid())
while True:
value = q.get(True)
print(
'
Get %s from queue.
' % value)
if
__name__==
'
__main__
':
#
父进程建立Queue,并传给各个子进程:
q = Queue()
pw = Process(target=write, args=(q,))
pr = Process(target=read, args=(q,))
#
启动子进程pw,写入:
pw.start()
#
启动子进程pr,读取:
pr.start()
#
等待pw结束:
pw.join()
#
pr进程里是死循环,没法等待其结束,只能强行终止:
pr.terminate()
运行结果:
Process to write: 9188
Put A to queue...
Process to read: 9540
Get A
from queue.
Put B to queue...
Get B
from queue.
Put C to queue...
Get C
from queue.
在Unix/Linux下,multiprocessing模块封装了fork()调用,使咱们不须要关注fork()的细节。因为Windows没有fork调用,所以,multiprocessing须要“模拟”出fork的效果,父进程全部Python对象都必须经过pickle失败了。
进程数据共享
进程各自持有一份数据,默认没法共享数据
#!/usr/bin/env python
# --*--coding:utf-
8 --*--
from multiprocessing import Process
from multiprocessing import Manager
import time
li = []
def foo(i):
li.append(i)
print
'
say hi
',li
if __name__ ==
'
__main__
':
for i
in range(
10):
p = Process(target=foo,args=(i,))
p.start()
print
'
ending
',li
print
'
ending
',li
进程间默认没法数据共享
执行结果
ending []
say hi [
1]
ending []
say hi [
2]
ending []
say hi [
0]
ending []
say hi [
3]
ending []
say hi [
6]
ending []
say hi [
5]
ending []
say hi [
4]
ending []
ending []
ending []
say hi [
7]
ending []
say hi [
8]
ending []
say hi [
9]
执行结果
共享实例一
#!/usr/bin/env python
# --*--coding:utf-
8 --*--
from multiprocessing import Process,Array
temp = Array(
'
i
', [
11,
22,
33,
44])
def Foo(i):
temp[i] =
100+i
for item
in temp:
print i,
'
----->
',item
if __name__ ==
'
__main__
':
for i
in range(
4):
p = Process(target=Foo,args=(i,))
p.start()
Array
执行结果:
1 ----->
11
1 ----->
101
1 ----->
33
1 ----->
44
0 ----->
100
0 ----->
22
0 ----->
33
0 ----->
44
2 ----->
11
2 ----->
22
2 ----->
102
2 ----->
44
3 ----->
11
3 ----->
22
3 ----->
33
3 ----->
103
Array结果
实例二:manage.dict()共享数据
from multiprocessing import Process,Manager
manage = Manager()
dic = manage.dict()
def Foo(i):
dic[i] =
100+i
print dic.values()
for i
in range(
2):
p = Process(target=Foo,args=(i,))
p.start()
p.join()
manage.dict()
类型对应表
'
c
': ctypes.c_char,
'
u
': ctypes.c_wchar,
'
b
': ctypes.c_byte,
'
B
': ctypes.c_ubyte,
'
h
': ctypes.c_short,
'
H
': ctypes.c_ushort,
'
i
': ctypes.c_int,
'
I
': ctypes.c_uint,
'
l
': ctypes.c_long,
'
L
': ctypes.c_ulong,
'
f
': ctypes.c_float,
'
d
': ctypes.c_double
View Code
当建立进程时(非使用时),共享数据会被拿到子进程中,当进程中执行完毕后,在赋值给原值。
#!/usr/bin/env python
# --*--coding:utf-
8 --*--
from multiprocessing import Process, Array, RLock
def Foo(
lock,temp,i):
"""
将第0个数加100
"""
lock.acquire()
temp[
0] =
100+i
for item
in temp:
print i,
'
----->
',item
lock.release()
lock = RLock()
temp = Array(
'
i
', [
11,
22,
33,
44])
for i
in range(
20):
p = Process(target=Foo,args=(
lock,temp,i,))
p.start()
进程锁实例
进程池
进程池内部维护一个进程序列,当使用时,则去进程池中获取一个进程,若是进程池序列中没有可供使用的进程,那么程序就会等待,知道进程池中有可用进程为止。
进程池中有两个方法:
#!/usr/bin/env python
# --*--coding:utf-
8 --*--
from multiprocessing import Process,Pool
import time
def Foo(i):
time.sleep(
2)
return i+
100
def Bar(arg):
print arg
pool = Pool(
5)
# print pool.apply(Foo,(
1,))
#print pool.apply_async(func =Foo, args=(
1,)).
get()
for i
in range(
10):
pool.apply_async(func=Foo, args=(i,),callback=Bar)
print
'
end
'
pool.close()
pool.join()#进程池中进程执行完毕后再关闭,若是注释,那么程序直接关闭。
多任务能够由多进程完成,也能够由一个进程内的多线程完成。
咱们前面提到了进程是由若干进程组成的,一个进程至少有一个线程。
因为线程是操做系统直接支持的执行单元,所以,高级语言一般都内置多线程的支持,Python也不例外,而且,Python的线程是真正的Posix Thread,而不是模拟出来的线程。
Python的标准库提供了两个模块:_thread和threading,_thread是低级模块,threading是高级模块,对_thread进行了封装。绝大多数状况下,咱们只须要使用threading这个高级模块。
启动一个线程就是把一个函数传入并建立Thread实例,而后调用start()开始执行:
#
!/usr/bin/env python
#
--*--coding:utf-8 --*--
import time, threading
#
新线程执行的代码:
def loop():
print(
'
thread %s is running...
' % threading.current_thread().name)
n = 0
while n < 5:
n = n + 1
print(
'
thread %s >>> %s
' % (threading.current_thread().name, n))
time.sleep(1)
print(
'
thread %s ended.
' % threading.current_thread().name)
print(
'
thread %s is running...
' % threading.current_thread().name)
t = threading.Thread(target=loop, name=
'
LoopThread
')
t.start()
t.join()
print(
'
thread %s ended.
' % threading.current_thread().name)
实例一
来一个反的
#
!/usr/bin/env python
#
-*- coding:utf-8 -*-
import threading
import time
def show(arg):
time.sleep(1)
print
'
thread
'+str(arg)
for i
in range(10):
t = threading.Thread(target=show, args=(i,))
t.start()
print
'
main thread stop
'
实例二
执行结果:
thread MainThread
is running...
thread LoopThread
is running...
thread LoopThread >>> 1
thread LoopThread >>> 2
thread LoopThread >>> 3
thread LoopThread >>> 4
thread LoopThread >>> 5
thread LoopThread ended.
thread MainThread ended.
实例一
main thread stop
thread3thread0thread4thread1thread5thread2
thread7thread9
thread8thread6
实例二
实例一:
因为任何进程默认就会启动一个线程,咱们把该线程称为主线程,主线程又能够启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在建立时指定,咱们用LoopThread命名子线程。名字仅仅在打印时用来显示,彻底没有其它意义,若是不起名字Python就自动给线程命名为Thread-1,Thread-2........
实例二:
上述代码建立了10个“前台”线程,而后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。
更多方法:
- start 线程准备就绪,等待CPU调度
- setName 为线程设置名称
- getName 获取线程名称
- setDaemon 设置为后台线程或前台线程(默认)
若是是后台线程,主线程执行过程当中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均中止
若是是前台线程,主线程执行过程当中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完毕后,程序中止。
- join 逐个执行每一个线程,执行完毕后继续往下执行,该方法使得多线程变得无心义
- run 线程被CPU调度后执行Thread类对象的run方法
线程锁(Lock)
多线程和多进程最大的不一样之处在于,多进程中,同一个变量,各自有一份拷贝存在于每一个进程中,相互之间不受影响,而多线程中,全部变量都由全部线程共享,因此,任何一个变量均可以被任何一个线程修改,所以,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。
来看看多个线程同时操做一个变量怎么把内容给改乱了:
#
!/usr/bin/env python
#
-*- coding:utf-8 -*-
import time, threading
#
假定这是你的银行存款:
balance = 0
def change_it(n):
#
先存后取,结果应该为0:
global balance
balance = balance + n
balance = balance - n
def run_thread(n):
for i
in range(100000):
change_it(n)
t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)
实例一
#!/usr/bin/env python
# -*- coding:utf-
8 -*-
import threading
import time
gl_num =
0
def show(arg):
global gl_num
time.sleep(
1)
gl_num +=
1
print gl_num
for i
in range(
10):
t = threading.Thread(target=show, args=(i,))
t.start()
print
'
main thread stop
'
实例二
实例一 咱们定义了一个共享变量balance,初始值为0,而且启动两个线程,先存后取,理论上结果应该为0,可是,因为线程的调度是由操做系统决定是,当t一、t2交替执行时,只要循环次数足够多,balance的结果就不必定是0了。
缘由是由于高级语言的一条语句在CPU执行时是若干条语句,即便一个简单的计算:
也分两步:
一、计算balance + n ,存入临时变量中;
二、将临时变量的值赋给balance。
也就是能够当作:
x = balance + n
balance = x
因为x是局部变量,两个线程各自都有本身的X,当代码正常执行时:
初始值 balance = 0
t1: x1 = balance + 5
#
x1 = 0 + 5 = 5
t1: balance = x1
#
balance = 5
t1: x1 = balance - 5
#
x1 = 5 - 5 = 0
t1: balance = x1
#
balance = 0
t2: x2 = balance + 8
#
x2 = 0 + 8 = 8
t2: balance = x2
#
balance = 8
t2: x2 = balance - 8
#
x2 = 8 - 8 = 0
t2: balance = x2
#
balance = 0
结果 balance = 0
可是t1和t2是交替运行的,若是操做系统如下面的顺序执行t一、t2:
初始值 balance = 0
t1: x1 = balance + 5
#
x1 = 0 + 5 = 5
t2: x2 = balance + 8
#
x2 = 0 + 8 = 8
t2: balance = x2
#
balance = 8
t1: balance = x1
#
balance = 5
t1: x1 = balance - 5
#
x1 = 5 - 5 = 0
t1: balance = x1
#
balance = 0
t2: x2 = balance - 8
#
x2 = 0 - 8 = -8
t2: balance = x2
#
balance = -8
结果 balance = -8
究其缘由,是由于修改balance须要多条语句,而执行这几条语句时,线程可能中断,从而致使多个线程把同一个对象的内容改乱了。
两个线程同时一存一取,就可能致使余额不对,你确定不但愿你的银行存款莫名其妙地变成了负数,因此,咱们必须确保一个线程在修改balance的时候,别的线程必定不能改。
若是咱们要确保balance计算正确,就要给change_it()上一把锁,当某个线程开始执行change_it()时,咱们说,该锁之后才能改。因为锁只有一个,不管多少线程,同一时刻最多只有一个线程持有该锁,因此,不会形成修改的冲突。建立一个锁就是经过threading.Lock()来实现:
balance = 0
lock = threading.Lock()
def run_thread(n):
for i
in range(100000):
#
先要获取锁:
lock.acquire()
try:
#
放心地改吧:
change_it(n)
finally:
#
改完了必定要释放锁:
lock.release()
#!/usr/bin/env python
# -*- coding:utf-
8 -*-
import threading
import time
gl_num =
0
lock = threading.RLock()
def Func():
lock.acquire()#获取锁
global gl_num
gl_num +=
1
time.sleep(
1)
print gl_num
lock.release()#释放锁
for i
in range(
10):
t = threading.Thread(target=Func)
t.start()
实例二
当多个线程同时执行lock.acquire()时,只有一个线程能成功地获取锁,而后继续执行代码,其余线程就继续等待直到得到锁为止。
得到锁的线程用完后必定要释放锁,不然那些等待的 线程将永远等待下去,成为死进程。因此咱们用try...finally来确保锁必定会被释放。
锁的好处就是确保了某段关键代码只能由一个线程从头至尾完整地执行,坏处固然也有不少,首先是阻止了多线程并发执行,包含锁的某段代码实际上只能以单线程模式执行,笑脸就大大地降低了。其次,因为能够存在多个锁,不一样的线程持有不一样的锁,并试图获取对方的锁时,可能会形成死锁,致使多个线程所有挂起,即不能执行,也没法结束,只能靠操做系统强制终止。
事件
Python线程的事件用于主线程控制其余线程的执行,事件主要提供了三个方法set、wait、clear。
事件的处理机制:全局定义了一个“Flag”,若是“Flag”值为False,那么当程序执行even.wait方法时就会阻塞,若是“Flag”值为True,那么event.wait方法时便再也不阻塞。
- clear:将“Flag”设置为False
- set:将“Flag”设置为True
#!/usr/bin/env python
# -*- coding:utf-
8 -*-
import threading
def
do(
event):
print
'
start
'
event.wait()
print
'
execute
'
event_obj = threading.Event()
for i
in range(
10):
t = threading.Thread(target=
do, args=(event_obj,))
t.start()
event_obj.clear()
inp = raw_input(
'
input:
')
if inp ==
'
true
':
event_obj.
set()
多核CPU
若是你不幸拥有一个多核CPU,你确定在想,多核应该能够同时执行多个线程。
若是写一个死循环的话,会出现什么状况呢?
打开Mac OS X的Activity Monitor,或者Windows的Task Manager,均可以监控某个进程的CPU使用率。
咱们能够监控到一个死循环线程会100%占用一个CPU。
若是有两个死循环线程,在多核CPU中,能够监控到会占用200%的CPU,也就是占用两个CPU核心。
要想把N核CPU的核心所有跑满,就必须启动N个死循环线程。
试试用Python写一个死循环:
import threading, multiprocessing
def loop():
x = 0
while True:
x = x ^ 1
for i
in range(multiprocessing.cpu_count()):
t = threading.Thread(target=loop)
t.start()
启动与CPU核心数量相同的N个线程,在4核CPU上能够监控到CPU占用率仅有102%,也就是仅使用了一核。可是用C、C++或Java来改写相同的死循环,直接能够把所有核心跑满,4核就跑到400%,8核就跑到800%,为何Python不行呢?
由于Python的线程虽然是真正的线程,但解释器执行代码时,有一个GIL锁:Global Interpreter Lock,任何Python线程执行前,必须先得到GIL锁,而后,每执行100条字节码,解释器就自动释放GIL锁,让别的线程有机会执行。这个GIL全局锁实际上把全部线程的执行代码都上了锁,因此,多线程在Python中只能交替执行,即便100个线程跑在100核CPU上,也只能用到1核。
GIL是Python解释器设计的历史遗留问题,一般咱们用的解释器是官方实现的CPython,要真正利用多核,除非重写一我的不带GIL的解释器。
因此,在Python中,可使用多线程,但不要期望能有效利用多核。若是必定要经过多线程利用多核,那只能经过C扩展来实现,不过这样就失去了Python简单易用的特色。
不过,也不用过于担忧,Python虽然不能利用多线程实现多核任务,但能够经过多进程实现多核任务。多个Python进程有各自独立的GIL锁,互不影响。
线程和进程的操做是由程序触发系统接口,最后的执行者是系统;协程的操做则是程序员。
协程存在的意义:对于多线程应用,CPU经过切片的方式来切换线程间的执行,线程切换时须要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。
协程的使用场景:当程序中存在大量不须要CPU的操做时(IO),适用于协程;
greenlet
#!/usr/bin/env python
# -*- coding:utf-
8 -*-
from greenlet import greenlet
def test1():
print
12
gr2.
switch()
print
34
gr2.
switch()
def test2():
print
56
gr1.
switch()
print
78
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.
switch()
import gevent
def foo():
print(
'
Running in foo
')
gevent.sleep(
0)
print(
'
Explicit context switch to foo again
')
def bar():
print(
'
Explicit context to bar
')
gevent.sleep(
0)
print(
'
Implicit context switch back to bar
')
gevent.joinall([
gevent.spawn(foo),
gevent.spawn(bar),
])
遇到IO操做自动切换:
from gevent import monkey; monkey.patch_all()
import gevent
import urllib2
def f(url):
print(
'
GET: %s
' % url)
resp = urllib2.urlopen(url)
data = resp.read()
print(
'
%d bytes received from %s.
' % (len(data), url))
gevent.joinall([
gevent.spawn(f,
'
https://www.python.org/
'),
gevent.spawn(f,
'
https://www.yahoo.com/
'),
gevent.spawn(f,
'
https://github.com/
'),
])
View Code
总结:
要实现跨平台的多进程,可使用multiprocessing模块。
进程间通讯是经过Queue、pipes等实现的。
线程是最小的执行单元,而进程由至少一个线程组成。如何调度进程和线程,彻底由操做系统决定,程序本身不能决定何时执行,执行多久时间。
多进程和多线程的程序涉及到同步,数据共享的问题,编写起来更复杂。
多线程编程,模型复杂,容易发生冲突,必须用锁加以隔离,同时,又要当心死锁发生。
Python解释器因为设计时有GIL全局锁,致使了多线程没法利用多核。多线程的并发在Python中就是一个美丽的梦。