并发编程
一、简答题
1,简述计算机操作系统的中断的作用
由于cpu本身一次只能执行一个程序,操作系统提供的中断机制使得cpu能够实现不断的在各个程序间进行切换,给人的感觉就是多个程序同时执行
为什么有中断?
现代操作系统一般都是采用基于时间片的优先级调度算法,把CPU的时间划分为很细粒度的时间片,一个任务每次只能时间这么多的时间,时间到了就必须交出使用权,即换其他的任务使用。这种要看操作系统的定时器机制了。那么时间片到之后,系统做了什么呢?这就要用到我们的中断了,时间片到了由定时器触发一个软中断,然后进入相应的处理历程
中断的概念?
计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得cpu暂时中断当前正在执行的程序而转去执行相应的事件处理程序。
待处理完毕后又返回原来被中断处继续执行或调度新的进程执行的过程。它使计算机可以更好更快利用有限的系统资源解决系统响应速度和运行效率的一种控制技术
中断的作用?
实时响应 + 系统调用
2,简述计算机内存的“内核态”和“用户态”
计算机中的“内核态”: CPU可以访问内存所有数据, 包括外围设备, 例如硬盘, 网卡. CPU也可以将自己从一个程序切换到另一个程序
计算机中的“用户态”: 只能受限的访问内存, 且不允许访问外围设备. 占用CPU的能力被剥夺, CPU资源可以被其他程序获取
由于需要限制不同的程序之间的访问能力, 防止他们获取别的程序的内存数据, 或者获取外围设备的数据, 并发送到网络, CPU划分出两个权限等级 -- 用户态 和 内核态
3,为什么要有内核态和用户态?
内核态和用户态的区分就在于权限的不同,内核态属于最高权限,可以直接访问并操作操作系统命令,如果不做区分,用户可以直接操作操作系统调用硬件机制是非常危险的,所以要有用户态隔离重要的访问权限。
4,什么是进程?
进程就是一个正在启动的程序,一个程序不能称为进程,只有正在运行的程序才能称为进程,进程是一个抽象的概念,起源于操作系统。
进程是CPU执行的资源单位,进程就是资源集合。
5,什么是线程?
进程是CPU的资源单位,线程是CPU的执行单位,一个进程内至少有一个线程,同一个进程内的多个线程共享同一个内存地址
线程是CPU运行的最小执行单位,线程开销小,资源占用比进程少。
5、简述程序的执行过程;
1.程序开始加载,从硬盘中读取二进制字节给解释器
2.python程序同时调用GIL锁,拿到硬盘数据给解释器传参
3.解释器按顺序在内存中执行
6,什么是系统调用?
用户态申请内核态的权限的时候,需要向操作系统发出一个请求,让操作系统对用户态放开相应的内核态权限(以程序的名义)
这种机制就是系统调用机制,实际上还是基于用户态去操作,只是由操作系统放开了一定权限
7,threading模块event和condition的区别;
event事件用于主线程控制其他线程的执行,需要手动去设置全局的flag, Event实现与Condition类似的功能,不过比Condition简单一点。它通过维护内部的标识符flag来实现线程间的同步问题
可以把condition理解为一把高级的琐,它提供了比Lock, RLock更高级的功能,允许我们能够控制复杂的线程同步问题。threadiong.Condition在内部维护一个琐对象(默认是RLock),可以在创建Condigtion对象的时候把琐对象作为参数传入。Condition也提供了acquire, release方法,其含义与琐的acquire, release方法一致,其实它只是简单的调用内部琐对象的对应的方法而已
8,进程间通信方式有哪些?
管道通信
无名管道: 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系
有名管道: 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信
队列通信
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点
信号量
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段
信号
信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生
套接字
套解口也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同及其间的进程通信
共享内存
共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信
9,简述对管道,队列的理解
管道通信
无名管道: 管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系
有名管道: 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信
队列通信
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点
队列的原理就是管道加锁
10,请简述你对join、daemon方法的理解,举出它们在生产环境中的使用场景;
join: 等待一个任务执行完毕;可以将并发变成串行。
daemon:
守护进程(守护线程)会等待主进程(主线程)运行完毕后被销毁。
运行完毕:
1.对主进程来说,运行完毕指的是主进程代码运行完毕。
2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守
护线程统统运行完毕,主线程才算运行完毕
11,简述IO多路复用模型的工作原理
IO多路复用的原理图如下:
aaarticlea/png;base64,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4jvjjDPcN998IwP+HXfcIR/SPvDAA+V+nhF7nVVbKk4dSSCPib333ntd586d3YYbbigLhGOPPVbYXK4RI0a4iy66yB100EHCzn7//ffupptucg888ID0Ofrso48+6v73v/8JC3zKKacIAKMPApiuvPJK6edvvPGGxEefW2ONNaTPKXDKy1MdiTwVpQ4lkABUHVZqLRSJQZUBeP755xfGByaJVW/v3r3l9yqrrCKDLAP6Sy+95P7zn/+4Ll26uN12283169dPnvH+mWeeKeEZoFn9TjrppG7iiScW26jjjz/erbvuum7WWWd16623ngzmhx56qJtkkknkfd55/vnn5TtxfPbZZ27zzTeX36+99pq77bbbJC7AE/fmnntu98orr8j3aaaZxi2//PKSpz322GO0XX21UAcpj40pAatqs4zRnXfeKW2bBQcLFRii++67z2EbxYKFvjdw4EC3yCKLuKFDh0rY2Wef3Q0ePNitvfba8nvFFVeU92CYAFGAoqOPPtqts8460jennnpq995770nYNddcU9jdckbmjVk7qdS1JIEEoGqptuokr6oKe/PNN0V1xmC60EILyYoVIMPvV1991V122WXyHXB18cUXy3dADYAK4LLAAgsIuGGwZnXMxXfsOK666iqJizi+/PJL9/TTTwvj9NBDDwnD1LVrV7faaqvJM0AaQAkAt/7660s62Glwr3v37jLAMylwn1U2aQCg3n77bbk37bTTStpNuVmok6pLxagTCeguVVsc7Ahpz3zmmWce9+6778pjBVYbbbSRm3LKKaX9wzjRvwgHq0T/4r0tt9zSPfvss/Js+umnlz7Vt29fWXzMNddchT5MnwN0Ac70SnaEddK4GqgYCUA1UGVXU1FZ4c4333xiSMqAvNhii8lqlYGXD4OpqtcwbmUlzACtxt0M3FtttZUwUNy/4IILpHiskFnpoqLjPmo/vVBHMJCj7tMVMKyT2n0Qbtddd5XfH3/8sQArgBbXFltsIfdZPU8xxRSyCkedxz2M2PPcK1STvFNekgTKSUCBC31SARR9ENaX6/rrr5c+Oe+888pCBub3rbfeknubbLKJhAEI0VdQ07GTj74z00wzyaKFcDDL9D/eZfcd92CFeS+p7lLbrFUJJABVqzVX4/k++OCDZbCG5eEvu3IAIaxWGVxRF6DGw94JeyYYJQblBRdc0G23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xPcRI0a4n376Scpn09ODP22+YwCn4fPyGR/tkABUu/TPlEiSQNVLIAGoqq+ilME2kkDDAqgYPOjvPObFAhoFLhZstdT/iYYDUMWMz9lnn+122mkn98svvxSAzw8//OAOOOAAd+CBB0r1W7BEfi3gUYDF+3vssYe77LLL5LnNG0DNvqdtavjw4e7xxx93P/74o9xqSdkSgGqjHpmiTRKoMQkkAFVjFZayWzEJNCSAUiASn85tWR6+xyAHqSvQihkhmJ/4uVX75QEXGz8gqVOnTu6DDz6QeMjb77//7jbbbDPXoUMHAVbxlceYkc4GG2zgFlxwwZL85Kn59P1PP/3U7bfffu6NN94oJGEP4lTgxUMtdwJQFeuDKaIkgZqWQAJQNV19KfNjIYGGBFDICzXXH3/8ISqy5557rgAeABXffvutqN0+/PBD9/nnnwsj8+WXXwq4+fnnnwvi5t7LL7/svvjii8K9jz76yAFI9CKujz/+uBCGNN9++2332WefibpNQdyFF17oOnbsKEzQs88+K89IF2ADgAJMAWpgpYYNG+a+++67AptEnO+8845777335J0jjzzSzTfffPKc8OSJC4bp3XfflTJZlSO/SZM4Cc/11ltvuSeffLJs00oAaix6XXo1SaCOJJAAVB1VZipKqyTQsAAKY8CZZprJnXzyye6///2vm2GGGdy6664rwlt22WXdYostJuBl3333dTfffLP4/bj88suFEfrkk0/cE0884YYOHerOOOMMt8MOO7iXXnpJ1G38Pe+889zFF1/sXnzxRQFn77//vjv++OPdCSec4K6++moBVLfffrsANL3IA0Dp3HPPdXvuuacAIMDXSSed5Lp16yZAD5Bz6aWXuldeeUXyesUVVwjoueSSS9x9993n8AZMmscdd5x8J5//+c9/3FNPPSXvXXnlle6bb75xN954owBCZaCOPvpoN2jQIAFMDIa77rqre+yxx9wyyyzjODgTgBarPBOAalU/S4GTBOpWAglA1W3VpoI1I4GGBVCAEFRmp556qrBKAJfevXsLM4QKrG/fvgJ0ACPbbbedqNBgoBZffHG3zz77uNNPP13AEuwTf9dee20BOoCWvfbaS3ZqHHXUUW7ppZd2d955p7BOAKNevXoJwCJ9ZbNQiwG4unTpIiAGhgk26vDDD3dnnnmm69q1qzBHxHv99dcLO7b3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zCrZFXkeuIqBmM1H3uHb9pzGvGOW8lgjPWpJ44vzmwcQAYtNnZcZg8l2qaQaToR6UXkutNBCAqBgoKaccsrRWMgaLmahLAlA1XIttm3eE4BqW/nWbewJQNVG1cZsCxOfBRP2DEQFMeUAmAVUMVtT7tBsG79N14KWGCgpU5R3PqOVejlmijC8G4M2Vdfpexa0aR6aAlq1UePtk0uV7R577CHsE7vwDj744PZJvJ1SKafCSwxUO1VADSSTAFQNVFI1ZjEBqGqslWKemgIPGiqP9bEqubwJhHfzDurmvlXf2HctKLFpxgdp81ufa1zEc+edd7q9997bffrpp5J1C5x+//13d+qpp7rddtutAAx5/tVXX7ltttlGjJrJb6zaUxlYNWB112j15M7W4bPPPus6d+4sAOrdd9+tnkxWICflABRn4SUbqAoIuA6iSACqDipxXBQhAahxIfXWp6msiwVUeSCJmD/88EP38ssvu19++aWQkH0vD4TkqdnymKFY5ZcHXDSuGNh9/PHHbsEFF3T33ntvIV8aFibstNNOExbkyy+/LBHQoEGD3JAhQ9zXX38t921ZlEFTtisGVK2XdOO9AchFpspA1Rt7Vw5AzTnnnO6RRx4pqfBymxQar1U0VokTgGqs+q5YaROAqpgo2ySicmqxESNGCEBChQaI+OSTTxwepbmOOuoo8ePz0UcfyW+dIPmuKjfu8eE37ym7gxfqL774ogC+rK2STqx4rdZ43n//fffzzz8L48SHuHjfsli8B8MEAFpttdXcgw8+KPmiDMOGDSuEHTp0qOvfv78AQMqkNk+00SWXXFKAFfn84YcfhMWy4In4NK9NqQTbpJJqOFJbT3gi5yy8egMRCUDVcANtp6wnANVOgq63ZBKAqt4ajdVg5PSSSy5x2267rcN3z+GHH+7ee+89d8UVV7iTTz5ZVF1sP99+++1d79693X333Sfh55tvPgElr7/+uqO+n3jiCffUU0+5DTfc0F133XVuzz33dNdff73bb7/93H//+1+3wAILuLXXXrtE1QYYI/wRRxwhR35cdNFF7rzzznPnnHOO23333d3zzz/vvv/+e3fNNde4NdZYw+GckXeGDx/uHn74YUkHO5spppjCPfPMMwL4brjhBrfddtu5xRZbTEAX+YUFOeGEEwQAbrrppgLKllhiCbf44osLcCLfN910k9trr72knN99911hwlcAVb01Wp05U0YPUKrqu3oCUa0BUNVZQylXbS2BBKDaWsJ1Gn8CUG1XsVa9ZSekciqSPHWYDctzbDYmm2wyYWPefvttObvswAMPdD/++KObbrrp3HLLLef2339/ARx//PGHAC1AiYIWdlkBZrAtGjBggMP2hXe5h5oMNdtLL73k5phjDnfVVVeVCGeqqaZym2++ubBJE0wwgQAzygUIWmqppYQd4nPLLbe4rl27CsCCVTr77LOFHcLf0AorrCCA6vPPPxdQB5tFvlHfPf3005JXgB7PZpppJgFoq666qlt33XXdc88956aeemr34osvCuBi1xhx5+0MzLsX17Stk3FlQ9WSfGq+47B5wCBuL/pu3oYCnuUZ3cfpxKrYvDxbWbYmX+RB4yvXL/IYxbEBeLwL0E9G5G039tVazAlA1VqNVUl+E4Bq24qIJ5bYbimenPImEatmgSEAUBAvYAfAAVuEegwjbFicU045RRgg1HF33XWXGAZjE4WqjfCAGq7ll19eWB3ieuihh4TxAdC88847bp111hGmh2eap2WXXdYdeuih8i5xYpsEELrsssvc1Vdf7R544AF39913u0cffdRNP/307qyzzpLwF198sbwDQ4WK6PHHH3e33nqrPIdBgoGCdSLvADMAHczVxhtvLHGTT1g30gA0Ed8rr7wiwBGwZwFGawCJAggr3/YEUtYoPs63yjxuDzFwaIk9W9zG1F5MAa/KL26rcVrlXGPEO0DLgRtrp6Y2fXmgVvNbbsOABX5j0nvJR/IDNSaSq993EoCq37pt05IlANWm4i3Y9+QBqXKslN3VFvtgQv0GUwQY4TP77LO7pZdeWtRtagOFao/VNSwNbI+CJoANAOTKK68UoDTrrLMKWOJCnYaqDNUawIx2ccEFFxTYAUAGae20004SHiaoW7duojIE8ADWAHaAGvLYr18/d8YZZ7jjjjtOABAM2AsvvOBmmGEG9+STTwrAgj2DlYLtAmiRP/KKmo54Tz/9dGGi8BgNs4aaEIePhCXfMGFcFnwg09Y4gcwzym8vI+o80EQ9fvbZZ6OVywJvLbMFIZpnBTkxaxO7g4jLaH152R7RHEPVFPtnd2BaVkrThkVFBY0tnAVX1u5OwVIeq9XSnpsH6BKAaqn0GiNcAlCNUc8VL2UCUBUXaQkjEsceT1zxxJbHBtjJDXYJ4HPPPfdIUEDFJptsIrZJABPiw0gbOyQYHd7daKON3GabbSZ2TpNMMomEvfnmmwVkAZIIc+aZZ4pKjh1ygCFUdccff3zBHQHM1+DBg916660nz9966y1hqbCfYicTIOqYY45xG2ywgdhRLbLIIu7YY48VVeNaa63ltthiC2GduI9qD5CH80YAHnklHsAS72PfRFgAIBfqSHbvARgpw1ZbbeVOOukkAWTkRQGF9Uml4EKBRN5fy8C0RE3VFi2FPFjAR7m23HLL0Zw/KlBBzhjex64jLEjIc2uhebftjXdi56MWyKhcY+YoT96WNYpBlcrZtn3CA5AB5aii9coDv00xUS2pkwSgWiKlxg6TAFRj1/8Ylz4BqDEWXYteVPBjB3GdJJhYWH3b3WSxmwCbCBMJqjhAE+BBJxZUc4AnWCW9ABuox/SC0YGx+eabb4TdQQWG/RNxYSv16quvCksEiCFfMFHc0wkWMIPtEeladwLEwU48vd58803ZwUdeAF3kkfK98cYbAsZQGaJ2Iw1AGKwZH/Kh5SFd8skFYCAe8qu7BXmGPVTeZKuTfUtsZOIw/G4KfLSowlsRKN6pSH2xGQCGUeXOPa1XZHbYYYe5NddcU8Al+aXulbGySSMj6jUGRLQBBVHYwSFfVdOqPHiXeLmIG3UqV568qVvqlIu2rEb9CmBJQ58TRuuYfBxyyCHCOFKXhOFdnpM2TJwyU7ZcLanXuAoSgGpFo2zQoAlANWjFj22xE4AaWwm27H0dxJlYABAXXnih2C7NPPPMYnSdZ29CzDoR5TFXdkKy31UFYsFEvIrPm1SYIMvZ3MSTfcwy2DPs8tQ6lvkoZ9CskoxBZAyKmlNHaTxNsU9WxRXH195n6QF2YRT5LLroosK2caGmpJ3A3qFi5UJdi/0Z9mC8h+E9zknZOKBtBZANKwgYu/zyy939998v8WA7duKJJwpg+eCDD2SDAcwkoJgLxpAwsJy0TVhKVLAwfnq4sNYtTlGPPvpoCQt7COiFTcS+DdUtzCDvwHBivwYriswBSuSNPMB44ryT3Zrkdd999xWQD5jmHcqXp2JtWY8rhkoAqrUSa7zwCUA1Xp1XpMQJQFVEjLmRAARgcm6//XZ3/vnni+oMtRmTBitvdsTxF2NpJgpW3tgE8WH1DeMCi6AsDX8JA2vAfZgefvOdiUnfV99OTGJ8iA8AxHPYBMIzUfG+xskz7hGe5/y2cfOMsPqOxstfDafvkh7h+Kvv8UzT0u/81XCUl/DEpd+tHIhHy6j5t3nWfGnayMjKLe+7pk96+p24Y2DaVi1EGaQjjzxSDPsBIbhvmH/++QXIAkBQZc4yyyxyPh3lxxYMAMUuMtoW9mKoX7kHC8kORmzRsGNj5yLti52K+N+ir+PRHYAFmwiQ79u3r9i+cZEuH8ARtma8C7gH6NBGyZMCbIATz/fZZx9RufIclS/AiPvsqoTNBIRhA4e9GwwTDBrAC4aJshIWlotNBD169JB6uOOOO0QtTf1a8FPue2vrh3iSDVRrpVbf4ROAqu/6bbPSJQDVZqKVCYUJAsNtJjg96V7v8VfBFK4JmEDY/t+9e3f5y28MtfUe33nGh2f87dOnj8TBb/0QnrAAtJ49e8p3wvCddzROfhOG9/iu8Wh6GlbDabqaD82Dxsf7Nu98513Nj+Zd49Xf+j5/tQw869Wrl8iNvxpGZUK+rVz4bvNJ+OY+Nq+8T30svPDCwny01wXowTeW2nth4wXYAEgAcGCP8M9F+4CpgY3CTxdqPfIJwMKGiLzD/KCGZScjtmecaUdYgAiAB39dXAB73GEAcFAHIlOAIy4j8K0FSEK9RrsF2OOYFVcTqhIGgJBv6oC/ADnSP+CAA2ShwJiCCwxYLuzwsI0DpOEqA1cYhOHClxh1C+hDLUx6gEFYL97VK94kMCZqPFufvJ/cGLRXC6+NdBKAqo16qrpcYqDLwIVhqg5MTe1CGtvBq+oE0IYZQn2BwTdOLWPwBDCwwIpVOrvNCA8LwDETnNUFY6UffuuHe/Z3HFaf85d48+KYd955ZQccz/lu4+Nec/ETRj82n/pd043zHT8nbe5hUDzbbLNJXmye47IiGyufvDy0JP/EQTj+Igf+otICmLRXO8e+i7YB0AAosMsR43psyVZffXW5DxACFOEyAmem5BVGkc0BgCvAl7I+MG2EAQypc1OaOAAKw33AExsFMOaHBYKZAvhy4ZAVdRwXLBFtlPD/+c9/CgBK5QLTBPjBjo3xgvTZgQkoA2ihFpxwwgndbbfdJqwXLBZqPEAuIJCy7rjjjgW/X6RJnogH1xVtLX+AKpsiHnvsscIIoGm2ddptOOSkqMdQAglAjaHgGv01VtwMWnrsh672lK5Pg8mYtxBsaZjQWKFjBI2aBm/cqE0UUDFJMYmhRkLtBFvABI5Kit+V+KhaMI4LlZA+47v9rarCptIvF6++w3P9TtxxXDznPmpFVQ9yj+/c0/jL/dU48/Jh0y5XBt4nLcKSHjK3Bs9jXvMtexNwQhvBESntYZdddhFGCAeiAA9YJ2yiAEqAHFR8qLoIe+ONN8p9QAz+tGhH/Ka/suuRMIDDHXbYQYzwUecBzJEFrBHxsdMSeyvCAth4HwN22Cj8iHGfdoDbCNg8mCJdXOEKg+fspOOCfeI3YAu1n7qkgHnaeeedBUwBVpSVxa6K43l4B5UdsmBDAqwW5az0ZW30iBs2DMCO7zK9yu2IrXReUnzVJ4EEoKqvTqo+Rwy22BqgvmDQaop5ojCVskGoesFUKIPIi4HbMnt8Z9cavpKwB5lxxhnFwFcvDdseu8Fsfdpt/+WcHFZILCXRaJuLDb7z3BDE6VcC3OexDq3xI1UJmaCOw30BKjjADmwR6juMylFpASywY6KPAvAwuEZVx6KHsDBNqMVgbnCICrMDkwTTAyDBIBxQAwMFCMJGDgYGR6mo8lDRAW4AYuQD9RltkvuwW7BMfMcmS+sJEAZYAkip/RigBNsnfDsBTGG6YLV4j3wCqrBlI26M2TE6x/6LuLgAdxiS627LSsg2biP6G/lg54UNWdz3KtGuKpH3FEf7SSABqPaTdV2lxKDHahTfPHpZmwPrmC9vd1VdCaPChbEDcexvh6QAV2wZV9YjBjQVzs5o0Wl6Y1qvFvSMSV41XZu+7iBsSXx5k2NrJj/C2kXD2PobakmebRjLeKghO88BEHqQMn8ViOuh0Lynxu7WBQbgBLUfx+pwoZbn+2677SbABabN7jAkTS6e8YFt4rn+BhhpGN1YoPnXzQP8tSCU37at2/f1PmnowoLnfCgbNlF4zh/T9lhO/uQvbmvYmaGyVXcQ7d33WttWUvi2lUACUG0r37qMnYGYQQ26HgeLrGjjgSZvQmrNJFWXgmtFodSJYPxKuUnC7nRqRTJjHFRBEBHYem2OjdTwTbWFlrYTTau9AUwMZqwsWlL+MRa6eTHvGJk4X/rbqtf1ngVEPIdhghmCpYJlggUCpMdMm4K3loBX8hjXZUtYSo3byjXvHmVBTYgbBUCeBTxjI+O4bBoXLiBQj7ITzwL2lpRpbPKT3q1eCSQAVb11U9U5g2FipcqOJOwR7O6XPDXS2LIOVS2MdshcOUAa21+0hwrPgqaYjWkp+KmEyBSsWPBejl2qZPuLd3dpWdqz7DFw5bfKQ9uABR158rbgiHdgkFgM2V1zFhyUA8r2fpy2zWcM/uO2U26xYM/Si1luWDer7q5UHcT9CC/5bN5YeeWVhfUqt8Ov0ixYJfpJiqPtJJAAVNvJtm5jtoMEW6HZ/QOIwjaA3Uj4ktFBJk/dUreCqVDBmpqo7CSZF65SE4hOfHnxUafWBkmLnaduHBORNFcG0sZwG7sb2ADyA3OC3Ux7XVZFbdNsrwlUGSgLLmw+YiYsZqxsPhUkxWxTXvsiPQtcy30nL7Hj03Lxx6AoVsfqe7ZMMetTaeYPlSLmCWosz0KRNqauKvLGNcuYtVc7TOmMWwkkADVu5V+zqdvBkMEEJ3qLLbaYOL9jZ048CcZsQc0WvB0ynqf2yGMc9F5bTdpNTQgxu4EhLyyk2q60tZhIh51ZbM1nosbZ6MCBA0uOpWmrPOSBx+bYnkrnJa7zPC/tcT7zGCALwPKAazn1aDkWLgaT5UBTcypI4olBnsZd7n6lZEz85I82hcd/nH3azTJaJivz5kB/pfKW4qkuCSQAVV31URO5sQOYPTm9NeqjvIE1z/agqYFWw5cDZ1ZFEIOBvMkkHrS1MjSv1m5E77UVeGnrhpC3gtaJAxUOK23KyzZ9vlMParyOqoew3MeAmGfszOJwXz3vDjaK53poL20D0INRsXoK1/hVDWnbBN/VgFnbAHEC1PSsM3ab4SeIsGzfZ3u5utWolPzsxFiNdV0OTOS1z5YCj7gfxn0V2VqWyPb7loD/cqx0c/krtyjLA1ZjW/9NsXEadzkZjG3a6f3akUACULVTV1WTUwUj8SCtvotQr+gga0FITLPnAS4FKXmTFelZ6t4OqJon+7wpWl/TJky57efEVW4FrnmpmkppZUYoW2yvQr2xLZ2t7QcddJAwifgBYks7QIot7fj7wcAYwEI4tpUTDj9DAwYMkC30gCicH/KM4zpgpvBlhd8q/P+ssMIK8pd7ACC2sNuL+mBbPl6f8THEDiu27JPulltuKV6vaSekhcdsLgAcjjfzDshtpWhGc8th20ClVUWtzZv2q5hditVedpLPAyz2fdvXbJ/M+24XJaSRB65s2vE4EJc3b9GkYezh2fa9vLEhjxUcE9nadxjPaE/IwTKMrZHB2OYhvV/dEkgAqrrrp2pzZ8ELno45uwoPvTh7ZPK0E01TB8rmUd+W6dHt2DFYQjCxPYYVVp5thjIdsS2FvteUDY+dKPT9PHBVjSxFXiPSvNu6wb8Ox2ngQwiwRD3gFR1ni9i6Ua8AFT4Y1HLsBhsJmGTwTYXDRbZ3r7feemI7Qhp4A+c39iTYyeG7h/j5jh8ifBChJsFuTi+OGWG7OF6pyQdACe/XsE8cKMu77BTDqzVpUjfkCXUeHq0rdVkArXKqBgDVVH3yLGZmLYixBtBxWeJ2XY5RboopIo48GVkAov22XP/RvpbXT+2iLVahVarvkQaLCXb44ckdp6I47eReXPY4zUrloVJtOMXTthJIAKpt5Vv3sTPBwSxMO+208tl0001lSzQDiR00y6087eq43GAUgyfLMtkJoxxrpWArBljlJgjSs8+aWt3actZKZduJ0gJNtq3D8OCJmt1GgGLkAJhRXzuo5FDxcXwG4bAPwWEjEwwOGFHPAXAmnnhiAT0cJwIIo51wn3s4c+Q7YIff66yzjoAlLmTPQbPjjz++HF6rdcfRJDgv5Kw2GDGcKmKXAoPFBegCQBHf2F55u77ygP7YpjOm72v7L2fIbgGTpmHr2ZYltp3Ks4nS9CzralkYZX/j/qW/m5NdU+OEXSRp+7B/Y/a4EgBGy3bxxRe7QYMGyaKQY5W22Wab0fw/adlaY74wpvWe3qs+CSQAVX11UhM5YuBAdcPuFLxi40U4HijtoNIc0LBAyg7IlvmJB6m8gTePHbKTCM4nY0Pnpmw4FKDFq+pyYK25yaIaKrec2gW1GSwU9Yq/G5wpIptLL73UTTrppHJQLHJ455135Kw1AA7sEmeZwU4tvfTSoq5DzYc6D9UboAxZcYQIoAkmi3fV9QXe1VdccUXxoK0Xu514DkgCMMGEEQaWC9DFM9SHeKiGvSJPTHYA+EoAKDtBK4DTdlBN9VcuL3G/i4FMHuCJfTbl+XCi31B3HC9kWWKNP+6feaouZfWaUv1p3yoHShTkxQxWpUCMlY/mhT5Au1t22WXFNi/vqlZ2shrabL3mIQGoeq3ZNi4XBsIc9cBkCShR9ZhONBZIWLARD978jleRTQ2u+n4eUMkbwHRQ5S82NxwtgS2NThAxu2Unmziv8Wpdw8aMWBuLviLR2zpRucHwcOYezBOe5vW4Co7kQI3HTksu5MexH6jjsJkCcMFC4c4CVRrvwUztvffe7u6775Z3sJFC7QfThNoOL/b333+/ACQYKJwU6oW9E2Btgw02cJdffrkYqqNGwR6Ld9htx2G4qAI5RBhVIOGnn376kiM2xlRQeQyNBVJjGm8l34tBBm0zBhB5iwm76SPOT94iR9lYjQtQveqqqxZ8RWl/1/wAYDkWxvZFOzbYPmNZsVi+8aJG42/NWDE28lagZ+PAZQYqPY7O0efx2DY2aaZ3a08CCUDVXp1VRY5vv/12WZExMeYNIvZezNZYVQCF+eqrrwq7p1jdMQjbSQyWQp372QGYHVfYxbAaRrUE+wFDwSDLJIxtDgwIgzGDH0bGHMCK/QxhAIHErUai2O9YlQH2PcSjO9CY7DGmZicZg7/6hMljzKqikprJRN5KG3YB5kg3AhAFNm6cqWYvQAusE4a2XLATnF3Gh4v6gK2A1aL+iRdbJuoaFS+HscJkIW+YLNRxsU0LoOzxxx+X+GgXpIf8eQ9bKD6AOeIGyPGdA5jH9ooBPLJQT9djG3el3rcAhfaPDRlyRT5c5Jm2rbsi9egT6uvpp5+WsFz0nxdffFGALPVEH6Ldx2pr6pO+xekDgChlFkmDtqA7M9kQwEHF5Ic46MvUr4YnTfoT6Wg/p97Jl/Zh+hX3aBNvvPFGIS+Uib6H7RttgHqCuSSutlSl2fGLnaZTTjllieNgypTHyFWqrlM81SuBBKCqt26qOmcAp379+skkxpWn0tJ78UrTFoyBD/ULqiAOKD333HPloGImQoy6eYaKiMNDURPqoM8uLk5m52R4vjMJsDLmXSY7QMB0000nqh4GXdgJWBQORmWFTLrsJGOXF39hShgcUTVx4XmY+LHr4R6DN+ALOwjiOO644+QDuKjlK4+1s+AV2yVW3IBRu/pviQrGqmWtjGLGzq72bbz6PVbV5rWnSti+xO1Sf8N80X5g52g74/qK2VcAEXUEKwjQZWEBOwdbhy8j1LIATOza6Lcc2YJtDypS2i87GWEcqV/sz44++uhCEbnHAdYsQOifMDCoauljgBf6Bn0EBhCQBpvIwuqcc84REAWohT1cbrnlBNDx3g033CDq1w033FCeEYb+T76wwaM/A5CwnVtyySXlsGLyQV/fddddJRxsJ2Bt//33d7PMMouA9bZQn8dtj7whO20HeYvDcd0+UvrtJ4EEoNpP1nWVEuqV/v37y2o1nuhaW1BWw7BDGKOzWwuDZRgn1EGkw72dd95ZBk6ADAM/KiJUchx4uuaaa4ptDcCGwRzgxbMJJ5xQAB6/GZjZJcikQlguVtS8wwSJV2sGR8LDUBEPkwoADJAFE8JJ7HhaRzUFkOIEeABGDA5aW/44PIMyoI8PeWdlzgpfmTZ91pZ/lRWgvCr3sUlPfUCNTRz6LrLQ78qs5D0b07SIX+3kYCABBHxQO/KX8x+Z8FFFAgQq7Xuqpe2HdgLQ2HrrrYWtAYhgPwYw4UNfoX9gXE/7Ju+0W1gdgA4LChjC9ddfX8AXwJS46CN6wR6xMYS+APjBUS5giLhh/nh+ySWXSF9DDvQb0qFfwCSRPxZFpIUdEYsV+i5tGnBEWMAdNnPYsOG6AnYbdgp178ILLyzgFYaKvzPNNJMAN8qEOwzS79mzp5t11llbKrZWh7PAjLGBzROAyXQlCSQAldpAqyXAQLvEEkvI4AeA4sqzGWgq4tiWgYmalS8DpaqWGGjXWmstmQT4vssuuwgLBZhSexxABRQ+f5kw8U5NGN6BIdKLwZt79qIc2O+ccsopAqaIg3swWazaNR9MTLp9n5UuzxhAYalYJesJ960WZJkXmJBYYePZfdFFF5W/TDb85bP44ou36Ye65QPTwMSEqwDUNm2dbkvjb0oGlZAPceCGgXbAbkMFUPq3a9euo92bd955BexWmgnLayKWNcQWDEN6TRe2CKAHuOdiAYDtGaB/ookmkvbKpXZttGXUqex6ZJEAO2TtpABOMFewSfQH4qFP0uZRyQIoAGSASgAVixA2lhCWNLBhI16cnLIQot/CeMEYA8wAXFwAM9o8ZWMMIN/kDUAIcAJwYXNJnRA3LgZgprkYG7p16ybfK2nInceyIo8EoCo10tV+PAlA1X4djpMSMMkwoVj/PQqkmsuQpcV1kGIQRO3GpffYAg9DRBoYLDP4YkOz++67izE44VD1wRrpzhjAEGo8nC0SVuNiYOdebHyLzQ7pWnUTq3QFX6y0UU9gWA1gYrs+4InJAvUik4LNc3Nlb8lz0kBdiMoI1otJC/AIAMQxJffLfQjf1POWPEO+qEoIi0PNAw44oBAneWgujrw8jGm+eK+pd5t73lxe855Tfm1jyF2BE+4TLJjS33369BH1b3sdY2P7GcCePGEXxAULNPnkk7upp55afnM+IGAQYNSjRw8BHvQJ2jIAmQ0gGOkTBy4hYJlse6YtorajHfAeIJeywi4BzIgPAMZ3FlMwXbBN9EuYS+RIX0FW9CmA15xzzikgDLZJ7d5gtdQlBQwTTBMMFCo+wBn9mzFipZVWkvyhmjzmmGMEMMFSk/9KgicrA8tAocrEt1lioFoyktV/mASg6r+OK15CBhQYCgZNBux4x01LE9TBk8GcVfMMM8wgq1JUbKQBPQ8YwvYBFRyDMxcDMioUVq2sjpkk1BAcWx0mD2ymdOBjMMfVAoM48bNqBjBh98RqGJsGBmHS4z7qg2233VbUHAzsgAYGcOxKAG5MKgA7bDDIH5NQJS+YMFbhTGz8JW2+85ffbf0hHYAjq34+GBrrd/62dfqkrWlouvrbPmurfGj5mewxymZytuAJVgpAjh0M7AsAn3BtYYPTXLsirzvttJO4maCdwqgCaAAggBv6FoCEOlTwR7grr7xSmFtdOAB02N2owIGy8Iz4YXx5lz5I2QE09BUWUaQLqwU4o28gE8YFbLEAOBiUw5IRjgUMY8UUU0xRyAsqOgzYcZuBKo7vyBPfSzxjIYF6kEUOOy6JBz9iMLOwo7B+xE/+Km2PmFefCUA11yIb63kCUI1V3xUpLQOrMlCovsZ24sAGCnaJVTJqAQAJaaBKIH5sMtgaz44iBWsYpHKfnVqshq3qBFaJXT8aFvBB/NhWYBuFXQYXcfBb09UdSzwjTuLHxkV3EDG48w75A+Sxa4/0rQqvLVQ442qrdFM7KSvSkKo0EqtehlUCJMOOYJtH24p3hJZjK9qyeLr4oI4AR4AmbInU0zhACpaENkoY2itqLsAW4MeCfp7TByhfbOBPGdQDPMCF/kgfJV76A2nSP1AdwhLzvoaDzdLdlqjzWPjg8JSFB6pw1GEsdgBbygTDGlM2VHzERzr0QWy1UAUC0FDRUzYWQABqFnH0Vb5XkoWKxzV+w5olBqotW3ZtxZ0AVG3VV9XkVg1A7dEZeYNvcxmOAYc9ToUBq9xhwrpCtu+XO4olD+Dp+/YZaTEAcy/Ph04MZOzvSg7cxJvnB8faZKh91tiC1+bqZ0ycE+ZNPJrf5tKzDEgcNi+Opu5ZGbVWXrZuARBMzsSh8oht+Mr5CGtJecc0TLkzHDU+WwYACSyvqr4JQ55hmGBUuY/BvAWDGsbmT+vWquH1uR67lFdv3OMd2C8YK/LOwgajdRYh6isqjl/7o75v41bWmXtN7fQdE/mWa1cAKDa86O7jMYk7vVM/EkgAqn7qst1KwkCoRuQwMnbCbOmEbidmVFYxkIkH7XhgjZ+XAzcxi6LASd+3wKdc3u0gbsNbwKjpVBpItUW8zTUUCyDjCaul9dtcGtX+3Na5ljmepMdUdT22Zc9r63G70zD6F19NqN/YoADQ0fCwN6ir1Wmq7R9xH7XAzOYh9oGk8rLG6HoPlScgBNAECwWbpek05Usplr1l4JpyDjo2ss5bCCQANTYSrb93E4CqvzptlxJhTIqxqDrMG1vVVbmJuRzLEwOfpib2cnmzE0Teipo08iZSuxq2K9VKgYtKxTO2DcGCtzz5jG381fq+nZzzyh23p3EhG2Vb8yb5mJFR5oy/eQyvOsGMyxEvWvL6UXNtNU82AB7ykSdnXZTYeMvJO15E8bu5/LSmzeXFpQ55EwPVGknWb9gEoOq3btu0ZP/3f/9XOBC2TRNKkScJJAnUjATGdiFVjQVVIMXfZANVjTU07vKUANS4k31Np5wAVE1XX8p8kkBFJNCUar0iCYzDSCxw0mykXXjjsEKqMOkEoKqwUmohSwlA1UItpTwmCVReAmonpeptDNTZhcdVSRvAyue8dTEmFV7r5NWIoROAasRar0CZE4CqgBBTFEkCNSoBa4PFUUd4CK+3qxyAwhFosoGqt9oes/IkADVmcmv4txKAavgmkATQoBKwGysQAX6ycDhbr5dV5aHCSwCqXmu69eVKAKr1MktveAkkAJWaQZJA40rAsjOcZ8dB4BiQ15MKT2s3NiJPfqAat93HJU8AKrWFMZJAAlBjJLb0UpJAzUvAuiYAMAGgOB9vTJyuVrMwkhF5NddOdeQtAajqqIeay0UCUDVXZSnDSQIVlYACjM0228ytssoqFY27GiIrZwOVjnKphtqpjjzULIBS1/+IsZyzRfss9k8Sd45Yr8+71iuvrS59V+lqG1c5x3ZNOeQr937scThvy3Acplyzij1yx+Fa6gxQ85AAVHV04JSLJIH2lkA8xnHYNyq8SjqxbO8y5aWXGKhqqIXqzkNNAqg8D9J5AMnq463XW60S3uF+7NU6T48fg6b4qIQ8B3L2rCo7uORR3aSZdySBeuaNmxHxNXWURHPHTGhaeWdNKXCMB0Sb7wSgqrtjp9wlCbSVBBKAmlsOM05XkkBNAijLLMVnkzHJ2w5uQYw9TykPHNiweqq5ZaHsO5YBy2PBYraoHJvVFFgjXgta8s5ti5k4PX6kHMOUJ4M8Bi8vLRtnAlBp8EgSSBJAAomBSu2gUSVQkwAqPi8pZoeoTD2YshybkveOZaaaUstZwFHuwE0FVZYpsmqyWPVmzx3jHQsELZXM95h9KneGlT0dvdy5b3msVx51rWloPAlANeqQkcqdJFAqgQSgUotoVAnUJICyQIfvCjgUtJRjapTRseAoVr1ZlZY9HdyCNo1fw/7666/uhRdecD///LOo4RSU8PvRRx913377rWQ5ZpvybJw++OAD98wzz4ymVrTvx+wW6cUHc9oyvvvuu+6dd94pYbNiBo40CWPZNPJnwZl9JwGoRh0yUrmTBEoloG4Mkg1UahmNJoGaBFDlVHS28qyqSkFWOUPypgzMm2KibHrzzjuv23LLLUuAz/fff+/WWWcdt9VWW5Wcgh4brFt26Nlnn3UzzDCDGzp0qLyTxwaVA4DlDvK84oor3IILLuhef/31kvw9+eST7rTTTnPffPONO/HEE92aa67pvvzyyxIQFaswFVQmANVoQ0Uqb5JAvgQUQNWbfPLG3nQWXr3V8tiVp6YBVMzoqHpLRZK3S64l6j8FXBoPDI+NyzJehAHozDfffAJ8NH41UD/iiCPcTDPNVMIQ2SpT8KR/SWuOOeZwhx566Gg1GwMnfSe2x+JFteHi+2uvveYmnXRS98ADD0icGs9tt93m1l13XQfrddNNN7mZZ57Zffzxx7lMWSzrBKDGruOlt5ME6kUCAKjVV1+9XopTKEcCUHVXpRUvUE0CKKSAeozJfvjw4e6www5zxxxzjPv9999FQLA4r7zyijvnnHPcsGHDBLzceOON7tJLL5XfehHmwAMPFLZHAcJVV10lYblGjBghh2QSz5133in3UHOdeeaZ8g7p6XtLLbWUuPi//fbb3X/+8x95Bog69dRT3QILLCCgBVXf/fff784991z30ksvFd797bff3HnnnScsEGEWX3xxd9xxx0l6p59+egH4PPXUU+6EE06Qc5iUbYLlOuCAA9zxxx/v+P7DDz+47777TgDUKaecInl9++23BZRdeOGF7qCDDnKsongfWTz44IMS9tZbb3WLLLKIgCmuTz75xJ111lkOkKWXZbgSgKp4X0wRJgnUpAQSgKrJakuZroAEahZAMfHjUv/yyy93u+++u5tsssnkTKaffvrJTTDBBKKOwrjx/PPPFzByzTXXFNRUACeAAaAF9drKK6/sHn74Ybfrrru6xx57TN7bdtttRb0FMOMZjBCfXXbZRcDTlVde6b766qsCm4MjufHHH18Ay+STT+6WWGIJqZ6zzz5bjj359NNPBZD897//FQA1ZMgQsXUCkJEOQGvw4MHu7rvvdiussIKke++997oddtjBPf/88+7kk0+WvALAAHgKFgFmE088sevYsaMwYdttt52wSlzrrbeefABUk0wyiQAtVIowYm+99Zbbd999XY8ePcR+i7RQ8wFIAZp77LGHgEec5CG7mN1LAKoCvS9FkSRQBxJgvKzHw4S1aizzz1iII03GRq6mvK/n2Y/GdmJN2Y3ZBavdIZ7XZGLzjbyd1eWaWmxTa8f6PBOWpnaONxUX6debnVzNAijsdgYOHCgMCtd7773nsEN6+eWX3RRTTCETPxcsDMCAC4Cx0EILudlnn93tvPPOotrSa/7553cdOnQQ5mX77bd3Xbt2dRtuuKHcA8yQHgAEoAJAwZ7IGpkvueSSbpppppEGgm0R76EyA2zB7AB6OO7g888/lyT5DuDbb7/93GWXXSb3SAMGCgCl6XKfe2uttZbkCQYJo3DbiC+++GIpM+wTAIl3AV0Ati+++EKYJp7fddddkr8dd9xRWCjKRVgA1B133OGWXXZZ9/7778s95ASY2muvvQS4xYNJAlB1MPOlIiQJVEACuguvAlFVZRQxgILNZ1Gtl7VV1XvWBldBltqTlrOrVdtYC2CsW5rY9jfP5pUwdm5Q4NWUna8Veh444nnsHsfaxvI83hBl48wrd1VW9BhkqiYBFJUJ04Sqi8mfC4aHjgxgmGWWWQQgccHuAGx0dxyMDPZKAB6coam7gFlnndV17txZGCPUZs8995yAKeKBsQF0AUAAK/PMM48wXrBB2qhhnGDE+M3qpE+fPgJGUAkutthi7qKLLnKANOKksaHmO+SQQ9wGG2zgjjzySPfjjz8Wqo/wgBjCA8a4AE0wRoMGDZIVEEBR8/7RRx+5pZdeWgDfq6++KuUjz1o+8oF91kMPPSRxoba84YYbpJy9e/d2Tz/9tJRt+eWXl3ID1Kaddlp3wQUXSHmJXzuBdpQEoMagt6VXkgTqUAKNBqAw1VB7UludMUtUzt2NvsMCPLbJ1WflbHWt/a2mx9+Y2bE2sHahb8NZYMd3wjG3xs6lbTk0X7bcloXL87sYA6x66gI1CaCogD/++MMNGDBA1HOAD9gWVHLYLaHSgjWhsu+77z4BI5dcconYCB177LHCzgCIAAHY/NBweJ9wAAje+/DDD90tt9wiwIvvMEAAFMAG19FHH11YhdDoYG/69u0rLguuv/56UYPx7sEHHywMGEAIFZ3aasEkES+qOVgt3gEUwiKxwjnjjDMk/amnnlrspQiHLRPxqx2U7WybbrqpgB7KD2jr1KmTgEkubKf69+9fsOOCVUIeyI5w5A0bL2QC67Twwgu7Xr16uV9++UXkjI0Wl+18CUDV0zCQypIkMOYSqFc/UCqRPBWeLmwVbFgwYt+LGaF4IRqDKftuvJPcskOPP/64zEHMIbEaUcO19HBnzeN1110n86WW1wKvvNYRly2WQTmGbMxbWvW9WZMASv0TARjovAANBTYADIzKAQgKtNhhBrMEO4MKjYrHDuqoo44SGynUccSJmk1tj2B8sIcCjNBZ3nzzTUejxSUATA4G7DQwbTQYdgPOUMe9+OKLkjYACgYHwIMaDiADI0Z8b7zxhgAULvKGqhE7JGyiyBeNmQvDb+ytWPEAygB4CozsSgHDeWyqSBOgeM899xQYKsoHkIORopzEhdE4+nzYKNSf5IkOSTnpgJQFEIcfK4Cd1eeTrwSgqq8zpxwlCYwLCdSrH6imABQqvHLqrnLuZCw7k8fkaHp5wEdBjaaJBoEFP/OXXlYFSBzMJ5hvaH7sDvHYvoq5b//99xeTkzxgVA7MqbpR52SbF9sW6832SctWkwCKzGMvBKMDWIkblxYubrDc14Zj3RLYBqtxlatwvc875ToK6SgVavXZmh+L7POca9q0Y59RceO2jTQ2HIw7qU0r1rPHYa0c9D0rzwSgxsVUldJMEqg+CeguvHqdJGMGChMOtb3VcVPHyK+//lrMK1ig69iNCQW/Wdhyj81HLPQBNyxm0YIQjy7SYfyZ31iw847OJ/xl0c09NiOhucA0hHcxDWERr7uo2aWO6xp2dmOjxW80LyzA1VxE5z3IB7QP5IV7mGwQHwtyNBKkib0wC200EsRHGPILkCRNCAIW4ZQ9nmfIt51vqq8Fj3mOahZA0RjYbQc7k1dh1niunAGdfU/D2CNUFHBR+XlHnlhA1hygKge2rE67XD5Jh0Zr09NGqX+bAnOxDtuuSOJVQjwI5lHTvJMA1Jh3uvRmkkA9SaARARRgJb4ARCeddJLs1mZ8BEyg/WCOYrf4xhtvLKBo6623duuvv75oJtisM9VUU7nPPvtM3ptxxhkFsKAtwWxEtQ2kBVBBwwHQ2WijjYSBIn60KldffbXs2MYuGLDE+zzHtldtXDHZmH766SUdO/ehbSAsO9fR5mACw0YpCAryyM5y0kSzw25xyoWdMXa/2PBic8vOcvLLxi7dnBUv/uupzWtZahJAAQBowLgvwNBZVWEWVFiw0RSrZAFDDEKa0iHHQEN/WyYnrwFZoBaDlxggxbRpXI6mVnwxwxQ3Xgui4jxZOdh47PcEoOpxOEhlShJovQQaEUBh2qAX4yJaBQAGZhawS/zFPKJfv34CKGB02KS04oorCrgab7zxhOGBmQK8sKEIdkh3guNmR30BEj9zHK5lcBfBvIA5hjJQsFX8hgHq3r27sGMaL/ausEXkFzMPgBeblKxdK+YibBxiLgWkYRfLznFc6kw33XRupZVWEgYJcxbSJF9sPgJgARq7dOniVlttNXGNQ3hMUvK0Oq1vWdX/Rk0CqEqItTX6awUO5QBLzPCQP6vuas6Yz8bblOqwKbBXDiDZTs73GJTFz8vJlvdsOVnp0NkxYoxBViXqJ8WRJJAkUBsSqEdHmjrWxloK3L+gwgOQ2GccgcUubN0VTs3BMgGadNyFqWFTEG5yYHjwz8fF72222Ua+A7jYIQ7rw9iq72JzO9tsswkA4mJjETu9ATWo0dgEhWoOBgu7W/KGWg5gBfgC9ADYUP2xEx1Vo5YRYIVfQk1vyimnFJ+IxAFQUr+CpAO4wv0O7nJg0gjDu3vuuafkC1ID29k8rVBTWpLaaOmj57IhAVSejZFlZNiRhl+kcqBE3493KeSpxmxDioGUBVl5IErvqdNM8qNgJW6M6Kahc3GtEDNIqP9iZszGpeXU95oCaoShHKyiGBxU567x1WpHSPlOEkgSGDMJ1OtZeDqmMebpWA1bAzDRXXiE0TGR42xwJ8NmIVgnDLxZZHKSBYzPMsssIy5rABkTTTSRbOIhHK5y2PRDPOwkj43DSYONPPgOhClixzYACzZIHXuimgO88S5git3YE044odttt91kLuM+YIvd37jHQTXIOE+azBkwVzBgXIQF/HGpT0IAHEbpiy66qJy2AVBTZgpQCJgiLvwvohJU2ZVbsI9ZS6u+txoSQOUxRtoR+Av6hpbMs2viXYATRnMWlGhjjIGEva9pWHWftbkiPv0QFuCDThrdOasIBWCafxqnNlD+0kHReVuVJvpwdvWxy8LmN5YBqyFAmPUfounlyYGBgo4GbWs7Sz2uMqqv26YcJQlUjwTqzY2BHZ9jKbMLGxUYtkzxghnbINgpgA5MDwbY2BABRrCDAnwxvuI8mbETGyKMwLFR0rGWxbJ6Oo8XtIAtbKZwGL3PPvuIrRK7t1H/AWhIAzaI0yiYOzjcnoUubBmgb+2115Yjv2C4LAAkDpgmgBnqPk7UIG+APgzFOWVj7733FqDFLnE++EFkXgJY4WMQ+yfyzk5uXOqo8bvKrymZVk9Lbn1OGhJAISZ7QLAVG9QmBwDTwLVRA5jQMytYAdSA5EHxaueE/yZ7WSDEd+JlVcDFOwAWwE3cwEgLKlZVZnRKOpnqrImDjmmBCsCHCxoY31iAO2WqiIcVCKsiTZvnNHZdVbFyARDZTgUIY7dIPEhovPiKgs6lw6UrSSBJoHEl0CgAirEQkIJPPVRj8djN2IhNEECDuUHHTnaKo3LjIgwqO4ywcUVgz2blGfZTqMB0EWy1HDo3YP/LjjjGbRawgCXS4F3u48iZsZ15AlaJOYBxmvEdJov3yJ868sTNDUbivKv2VLjw0XmFuY131aCduQx1HuCK76gAmV/IB3MGvzVu2yuastmt1d7TsAAqrlgqn07BioFdEdCjNDzus4MCKhOkTiPgSBeMAAE27IDA2A4v3tCYCqQIp+CKHRLokXmfiwaMfyc8i+vBxRjwQeOC4Elfj11h1YJxIp0R0EOnw1cVKyH1AwVAgiamY3NkiwIo0mJ3B2UiTXZmkA5GfujTWY2QT1R/lJddHHQaOgB6dNKFvdKGr4ASP1gATFYdFhSWsyur1c6R8p0kkCTQvATqFUAp4NHFMOMgxtmYLmDMzW/L0ltJ6ViYZy4CA4TaC/cG9gKUYEuk4Cw2xSAs9+w4G9umxiDFxmG1FZpuOa1EXOvxQtqCR7tZyi7cNYym29x5fs23tOoL0ZAAyqrNqHBAA/QmqwuQOp0DdoUL0AK6ZwcEoIkdDhjkAVYARiBuEDzGhRzMCw2q4AkaE3UgzjMBOeys4H2OcYEGxZkl+mjoYGhZtpECdABReDWH6QKUAVZA//j0QI9NHAAgdM04P+Meuzy4x0HG1mYKh6DcAziRXwAWHRQGbbnllhMbJgAUgwLpspJAl0+ZWZFAGQPYtGNSPvKDjCif7YDawauvmaccJQkkCVRKAvEkXW8AqqlxjLJjC8QYCAvPWGttW9Xcwarf7BgJiGDhzaIWw3M18eA9vICzWFfmJwYptv6shsMClXixqyBQw5QDfPoc5qjccSw2PzrH2Xt5nsvj+aG5DVWVaqPtFU9DAqgYGUN50iH0oF81/tPGCJ0JCFKDQNgZdMSsRmBgdNso2zrxk6EXwAhbKv5yATh22WUX0YmDymmoCyywgHQmjoJh9aEG3926dZPjaGCLMByE5ULnjX4ZoLPUUkvJTgiMEfVcJrasYkyo9C+NF3UgIIg0br75ZtkpQjmhjmGQAGx6+DHMEvQxYfRC943Hdy5AGnExcEAPN2Ug314NOKWTJJAkMG4lUI8AKs921Y53LEYZ27FnUuDQ1OYbBWUACMZ9O0Zr7aFei/3uxUBJAYmmZYFMDE5iO9dyz21cFkjF82QsE57HDJhlo1rKbo3b1jt2qTckgFKaURs1bJDuUuCZGvlhd4RdEaostoDCSnEmHeoyAA/qOs7Hw98HFwbcABBtkDj75B12Xug91HbsZEB3zIWhH8wUhnqwQlx0Lra8QumSFuwQenWADE7QWPWQNkCOTgyTxUWeAFnKQNGYATqALRy8sXICsMFm6eHL6MgBiKjwyC8qQz1HjzwDvNhZQWdAP04eevbsKfp2lZ8dOOpRzz12XSy9nSRQ3xKoRzcGtsZi0wTGOPXZxPxg7X10/Mt7R+PMCxMbjOe1mHiDTrlxN74fj8l5Y3Seis4CoBh8NaUqJO/lwGS9zQ8NCaB04teKpnEAalDBoYpjFwWAgsN7GRxgXfC0CrBAbQYQASzBCgF8Zp55ZjmMFxWf+sOg8WGLxPuo0ABJgA5UZIAj1IAwP9hFwWJhQ8UBvoAh7JywgeI+4IW8wF6h+mO3BecVwRxxb+WVV5b8oX6EOWI3BdSwXuySIH3stnDuNskkkwhQAliRd+JCVcc21sMPP1yAHdtfd9ppJ7Gfgu2CodMLOy3kwK4Oe9Vbx6jvKS+VLkmgchKoRwAVszLW9gizDRbc7ERj7NSwaBewdY2Zn6YkHYMiGzZWfzGfsIDecccdCz6kCB/bW+UBrRi0WRKhKSDWFFDKi7Nyrao2YmpIAJU32QNWWFUAFlBVYQMEQIFWhX3CVohtpDgbIyzfuQcQ4R2ACs9gsyztCl0L2MEwWw3MCcvuCd5n9UJ+AFCo1LDBAmgp4ufQYd5HtYdunDwCgAA3aljONlXuAZwIa90YwBqxk4+0UN1RFo2f/GIjRTzEp+c3AaL04GVVa2pHJSx5wokbW3bp1PaqR0PB2ujKKZdJAuNGAvUGoJpaDDJeohGAybc7rxkX0TQArBh/m2Ki9BljvKr/LFjK24yjtlVoHXCjwPyjIIjwLMitD8BY3cbv2A2OJRKIw7JMujnIkgwxg2bd2zQFBMdNq2yfVBsWQOXtSLANKnZFHzfI5vS7Gt42rPg8PcLoPQAU7BUdyvp3KudsU5uHzQfxabni1YuepacdwpaV73F54+YXr1LsUS7akRML1T6dNqWSJFBNEqhnAGWZGsZItAOcwYozyZilwnwDLQZjLQCHMFyYS2BfykYiFqcsVlnUooHgPgtSFt74g2JTkDpxBsSw0MaUA3DE2E76bPLBhYC9WMzi/wn3OMwhvEfcaEnsubCYpRAfz4kP9woaFxoXiAO0MOwQZA4BMGJjSxjCk0c2N7EpSd3eKAkQzynV1EbbKi8NCaCsMMtt7bRhYvAQbyPVhqM0r7oXsPdtR+S+jQNDbw5hxABcfW2UQ/S6ksgDK3pP37VAzK4elCGztLQFVhYs5q2GuAeAQrUIm2Y7TnJl0FZdNcWbJFCdEqg3AGXHwljiGI8vuOCCspPZGlAzZrLRCBMJgAUgBwCFug+nl4AWzCIwD8HzOKYYOKLE5yB/cUbJJh+8e8NioYnANhWVINoFtBMwXKRL3Oz81rEWkANwI220IWxkAswRBy5x2DGtZQIwwaBtu+22cg8mDdMQdlez45v5h3JccsklslsQJ52AOzZIcZAx5irkD8CGR3W747spuVVnyx37XDUkgFLgEKub8kCLBQQxG9QcOxSDFn5bFkpZH6hgVGage7VfUlcLNk8xaLJAx7JPNh37vt0hYZtO3tbSvLRsOGzGAFDs5rMyalQqd+y7YoohSaA2JVCPhwnHdkVaMzBA2L9ap8O6gMS3H+ACp8QAHC5sXPH5xE5sQAs7mLFFxf5UGSpADy5o1FkyG3UAKxioA7Qw28AWlg1IgCp2X8Na6XiMynCOOeYQO1gWtOSBfHKxMYnfyiiRBja4gDaYI+xe8fUHgOIMPMAZG44AWozvHH5M3tntTVzYX+GpHPMW5jLLbjXi2N+QACoPPKjKS4GD1QFrw6Dx4T2c31afbDubxmNBRcwMxcArBitNGQUqUNIddrFfD/2dx5JRbuhl64KAjmDVezFgjLfVquw4TBhjcjpsUt3V5sSXcp0kUAkJ6Fl49TQO5NkwMTbCQOGzj8008QXoAXQAgGCLmCtgm3SHN6ox1HeAHwAR6jLiRN0H00R45hhAFpt7ADNsTAIMoTZj3OYvbBT2qnoxn+BWB9UfRu24vcE3IBdpMk7rIcfMa4AiPSAYsITpCPcBZ/gGJL+E4S8LZZgx1IHME7jWAdTlmYRUoi3VWhwNCaCsQZ1la3QlYe2ItEIBRuyMw8WBGl4DHqBo7cBhUXhTWz/1nCEabgzISDN+N1aNQbVyUCSHT+bllzisjl6BHR0QVwykjx4c31F6srhV/cUNWfOjZ+XhTZcORofVtGI1Za11hpTfJIEkgdZLoN4AVFPjGG5eYIvUt5+1NWWnM/772KU900wziXoOoAXg4IBfxmy0DezIxoEywIT3CYNKTDco8S5qNN4BDBEf7wJaUKtxVh5gR+cr/gKgNtpoI1GpcR4eLBWboXCxo25oVGMBAGOnNaAIn4S44gF8oWZkoxK7CVHPcbYqbJVueEI7AsBipzcbkXTeYU6oJ/Dcmh7QkADKCqg59ZNVe0Gl4lMJz91cNFicbqoRnQKQmMrUxoVOGn02DQ53BryP2i4GO5q/uCPHqyLOvaPj2eNjysXFfQwBoWBxjkleTj/9dNG54wjUAkWNI961YctFh1VdfWwj1poGmMImCSQJ1LYE6g1AxWOhtRW95pprxF0Mtkh23GOsxMUAdqy6gxkQwi5m7Il4B0DFM35jRwVLxYWvP0ARnsiJE1sp7JKIE3YIRgqjbdRw2DYBavQIMB2rcbODnRIgjPkAeyZOkGDBrOYgWi5UhoRFRQhI42w+gBnAiTwC7LhY3APEUDcC+pgzOLGDOYdyxFdS4dV2Py7JfcwKUbnoilk5AITUIyxuCrhP4wXcKErnPuwSjU3vs4OCo1kUQLGllOe6CsHYDjaHBkz87LTg4EdVB8Je0cFYGYDmeR82SxsrtCx0rnYKXASQN8AW7gcsOOI721npiKTBc90SS9zQvVyUg50ZME50WDoMFx7O11tvvcKp2TwnDj0cGMN23kMGtrOoXJWBosOmK0kgSaBxJYAncoyj620CzWNVUIkpgNIa1zlDN+dYNzIWvOiCmPkANonxncU0f/mtx8IQjjB5mgXC8Ex3a8etzmodGPv1yrNz5ZndUEQeGPftRR7UXYECyaRpKEqorhko2wEACGzHxJAPtA/oABix9RNjPgaAOeecU4AUoIDDg1F1wRKx84CVBw2SVQWUK7ps6E8O9eXCqBBGB1DDigI9Nx7MSYtVAxd6Z1gb3ZYKGCMeVikY8WEEiGdyDPugSKFfUdGhR8cZpqal1YexIg4tOaePPGLESDnJA99p8GyLBTjRMdBr4y6B7xgR4rgTMKgeyGHTiAsQRXnZvUFZkFG8irFuDBp36kglTxJoXAkoYIKBgqWot6ulAIpyK6hQG1WVhQWVMcCMAVLMaOXF0dwuZxtHOTulWGNgf8fxKzi0YDEBqDoHUBZVa4NgVYC9DuwToIbtmQAnjP4wuMOgj5UUHrkBWgAdwAS7KdAh4/uD+9C02ELB8hAGQAZDA0iBTYJaZZUCKII52mSTTYQuZcVAWN4hHGALfTnvwgStttpqwjZhMIjRn563h8oNVgqjbbak2obMPXaEkA70qx7HQhqANRr6oEGDRGfPRTpQuzBg0LeALxg5dN2o8qCIoWiPP/54AW7EgwNQdPDxlQBUvU0XqTxJAi2TgAIBnXhZ9HEiQr1NrOUAFAttFuD2ygur85ACLAugypln5NVAU/ZFTcncslF23ojz3dr4mwrfshZUP6HqloGKKxlDOIAN7ArG1+h6sT+aZZZZBKDQuAFUgAYYJs6YQy/MhcEeZ8xhQMhRLuiVubjH1k4AByyRpon6DLaI+EmTo1Zgr7A9AgSxMoBxwvcHYEa3vqqqj98Yd8NQcZQKeTvzzDNlm6ktF8aCqNJ4jkEg7wHIsI2CNeLCZguQxcV2VVgmLtgxVo4ATM62w3AR8AfrRXk5mgYgx2X9nai6Um2gcGOQriSBJIHGkoBlKmCzWQBy1ZMarykGKgZQeaAkdhuTx0ZpGjG4ymtNNqw1Xo/DxnHlAbe4bBaI2bhbA/QaqweE0tYlgMpzWQ9gAIAAMNhJAMCAjWI3gm755OBcGCZUeIARvnPhy4NVFrvuAB1sMaWREQYjP7y99uvXr7Aq+e9//1tQ1cFMTTPNNKK3Rv3HOwAsDPVgoAB2MEA4QUO/zW+cosH6QItjN8UFUOP4FMCXNn508ZNOOqm8xxZa8oIKD9Uc20+5KN8UU0wh7wAcMSzkO+waLBLf2SUCe6VH0lA2DB3Jax5lzDsJQDXicJHKnCRQBElqE8PWdgBUPYEn6rkpAIURebmrHENjwUjMDrUGQDXVBvMAWRxe85EHosqVO7X7fAnUJYDSlZBtINj6MOkDDNjhwNlB+MYAOLCNE1f5fDAAh6UCPLDbAcNumCm2kXIfNR87EjhbDlsjGCkMAdnJAECBCcLGaZFFFpE0Lr/8cvHngTt/VH+AFhgeDg3mfYzOeYZ6D/sr7mN/hApw0003LTBQgDbssjBk10YOo8Q9HLMB4vDpRJnZAgszRXobbLCBqO6wtcIj7oknniiA6+CDDxb7LgzFUeNh74RPEFR2gDTssXDOhkM1Tc928qTCS0NKkkBjSkDHAV1cMXZhAlBvqp1yAAoTkKYAVB5g0XsKXlSG8V+bZlPqueZaXh6YLQeYmosrPS8vgboFUFpk67QS0MOuMhggDtkFLKBGA2hgWK0H47LdHxUeYIOw6ucCdgeVG/dglGCqAC00VuyXUGcBSHgGACIsgAx7KWWOsDNCncdvgJPulCBOQBrxkB6DE6CH+PlO2vzmmTJsACHSgRlTl/rkRePmGWkTL+/zm/KTP9LDJgy/H1yEAyAC0Oho5It4dUdJ7LU9Aag0rCQJNLYEdELGQzYgamwm/GqUZDkAxTb+1jBQY8rMlWOKYjCWl89yDFdTqrum2Kd6q9tKtbe6BlC24eapolCTYTSOPluf85cddDBQqLu4yu180MaY5/U7fifvdx6lqxXb3G4Ia5eUBxbjlUzcOfIoY9vpyu0e0TDJjUGlumCKJ0mgNiWAqQKbVbChZLxksw27f+vlqhQDZeXRHixd3thfTkWYgNHYtda6BlDNiQbbJ+yisFOyvjtgpDAQxwVAU6i8ufjr+XlioOq5dse8bC2ZIFoSpqkcxKtrwo7pKn/MS9rYb1IHqLI4mBbwxAdzCMbTertse7WONNsbGNWbXOuhPA0LoOgUgCZUZJxBxG8dhFF3oXpDpdcS4756aAitLUMCUK2VWP2Et6qFGAy1FsjEK2Dth3mMLXFr/Oo0Nu6f5RwG1o/0q6ckbGxRAMVfAJSy9tWTy7HPSR6AamoX3tinmGKoFQk0JIDSwdcOtk2tinW3SWKjis06Aaha6eKVz2dTfaW17FIegIoZpTxQZJ0QtjbNykuksWJU0IqtqLJPuDzhO+x9vV0xgMrzA1VvZU7laZkEGhJA2QFajaPjlbO1iVJRNucFtmUir49QCUDVRz2ObSna0obCMk7kU73h5wEmu8gZ2zKl95uXgI6FACeYJ8AT360pRPOx1EaIxEDVRj2Ni1w2LICywrY7zPKcjhE2gafS5pkA1LjortWTpgKWeOHRUjYoBl4WLDUVp1W1I42477Y0/eqRZO3lhPpROXPKgYIn/taj/FsCoOqx3LXXMts/xw0JoLSxq3sCFbuqCvRvPFjrKrj9q6n6UkwAqvrqZFzmqLUTSHPMFZO0uvPQctk04rMZ1QVJa/MxLmVWy2kryMWXXNeuXcUWimOn6vFKRuT1WKuVKVNDAihEFw+08cGOsd8jwicWqtjoEoCqTAes5VgUBCl7NCbgJa8fogZ6+eWX5UglHNPiv40L/2V4y7/66qvl8G7SxV8ZzmdxBttaA/Zalv24zLtdgOI0WO2gOJS8Hq+WMFD1WO5UpuYl0LAAqiWeWhVo2Q40JpNE89VQeyESgKq9OqtkjnHWqs5ny/kMK5ee7UP2XVglABE7uTg6iXMZ8TOER/wHH3xQouO4IiZsdoBxnXXWWXKMEh7/09U+ErD1x0JTDchZYNbjIjMZkbdPu6rFVBoWQNViZVVTnhOAavvasCrkGLgr8IjBfSUBPoAGz/SAJS6+61FCAB2OBnrqqafkWZxurKL79ttvRSWntlN44eeeloO/pHPIIYfIsUKcCck9POXPO++8brLJJpPTAzi/EgBFunw22WSTAriqx8m7uVbWVBvROslbAObVl00rfld/5x2QS/1wKDtXDIjLgeW4rsqxh7Z8cdp57a45ebXmeV5f4nD41h7l0po0U9jakkACULVVX1WT2wSg2rYq4h1oeam1lvlpaY6xJ7rooovkTEYOikU18/bbb7s77rhDzkvkfEgAEAdZc94jv/FKzTFFqN/OP/98UbFxcU7j9ddfL0d9sMWd75wtSbywSxwhpBcnA3BgNmc86sWkSX4ATZxnSVrs+uL9Aw44wL3zzjsSNO8A8ZaWt9bCNQU2kEO5A8BVTvZ5DBJi2zIFKTEg1t/8RdVK3di48lxPWLCcB9bsvbyTGJqqp7bYhVkOQHGIe2vOwqu19pXy23IJJADVclmlkEYCCUC1bXOIV/K6+o4ZB51o7P2xzRlnLmIYvM4664gaDUC0xhpriD0SqrMhQ4bImY+wQpyDxqqc75dddpmwRICd3XffXbIByFpqqaWEWWKi5RmsEUd+DBw4UMKpXzbu8RzwFk/Affv2lYO133333YLNzdprry1pxDtnx7b8tfJ+HtjRvKtMbLuxbSXvKCgrc+zNLIhVIBXbu1mmKs+ezaapzzVvNg1NS9tCObMJtU21cbXVQqIcgEp+oGqlh7R9PhOAansZ12UKCUC1XbXGgKCpbf1tNXlMMskk7uCDD5ZC7rHHHrLLCuPtI444wi2//PLCNC200EJivM2h2ahxrrzySmGLOAZpm222EUZipplmchtvvHFBWAAkjk7iOvTQQ+U9vW6++WYBR4A2CwhR9REP3p9feOEFCbPAAgvIgd/HHntsgXFpFC/keaosVY/GgFKBT0uAZp5aOM8fngUvfLdskTJBFnw0p1qN44hBoP62YK2cp/pK9sqmGKjkibySkq7duBKAqt26G6c5TwCq7cRfjlGxapR40qpkbkh/ggkmcIcffngBQAFa7rzzTvf000+L2o0jkFBlsCsO1R3+gFDXqbpt++23l4kVA3AOmeW4JC7UbwqgAGaAML14d+WVVxY267XXXiswS6gNV199dWGqmLjICyqUs88+WwyYN9xwQwFceRNeJeVSLXFZIJEHrvW53UncFBNkwSrxWVnGTFBTbTOWj03fOkGN3cSQBsdnUf/kMwbC5eo2Bl6Vrv9yACrZQFVLTxj3+UgAatzXQU3mIAGotq+2WI2nv2MXG5ZdaG6135JcDx8+3A0YMMDtsMMOYtiN2mzyyScXo3EYoI8++kgYKFRzgCDUdhtssIFbb731xG4KUMMuOi4A1HLLLed+//13iQvws8suu8gz7KcAYRika74BaKhIsHECnPF7r732KrgpuOSSSyQO1IZce++9t/w+99xz5XelJ9GWyGtchMmzg8oDN+XspcamnViAY7+rWjBWMysos3KiLVibKGzsVlllFVHt6kXc5fqArWcbJq9vjGn9JAA1ppJrnPcSgGqcuq5oSROAqqg4SyKzDIOCAp0k7OpdX8qzZxmb3AGOYHgwHldGAEYI9gcwBWDieuONN9yjjz4q4AijcmykuIdaD+Nu3n3mmWfEoBz2iB11DzzwgHv99ddlYsTW6rHHHhP/TvbC7xNuC5hUP/zwQ/f555/LY+LjN0boH3/8sYAl4iXdl156abR4xkYG1f5uHqNUzji8nHqP8BZwxO2O5xqn2iZZudh75dK24EnzEasAiZO2seCCC7q11lqrAIJtfrC5AyTT3vKutgDOTanwkhF5tfeQ9slfAlDtI+e6SyUBqLavUjtJamps78eYGlZGd7q1FZBS0KIgLu+vtZtpCvjZd/lumYt4d1a53Vq8Fz8rZz/T9rUzblOIATW/AZ20DQAlF4f98v2qq65y7733nsgOx5fYrJ166qnCMAKGaWeHHXaYu+CCCwS8AHJPOOGEgtpV65X2RvxXXHGFxA+wJX524A0bNkziv//++2UzAbZpJ554oqjmAD4whfgN46NAG1UubCQ2bqSx/vrrC4vJhYqYXZk4SSXvgK+FF15Y1LWokGk/AHF2hsKIxu2rErVTDkAlI/JKSLc+4kgAqj7qsd1LAYDCiBdGQq9GMeJtT2EzKcH+YFOkB7diR8R3jLAbyfanPeXekrTyJti2YELK5cWmhT0Y7QEVKrZosHcY4wNs2CmJywjA05RTTinq0RtuuMEtssgi4r+JeLBh69+/vyR1xhlnyLt2RxzvskkAYMQGAZig1VZbzT377LNiG4cq9tVXX3Xzzz+/tE1AE7s1sXE7+eST3bTTTivxwk6icsWtBa4vpp9+eskTKr1NN91UNhzASO66664SLwCJ3aC33XabOEwlLECOzQykDSuKmhiwWCnZl9vEwf3rrrtOygXIVNBWTk3akjaUwtS2BBKAqu36G2e5X3TRRWUgZDXLpeBpbGwrxllhqizhW265RSanGWecsbBlX0+812Mz+N2zZ0+ZHGESsDnaeuut5cME19SHyaupT3PvN/e8ufjH9nlz6Y/tc5VjU381DWS/xRZbyISOKrNSk3hzTVL7GZM3kzk2agAYgAhqTuzVyBvPUafOPvvswjABmHiGUT9qV9oTjBEuJth5+cMPPwg4QhWrF6pc2uPdd98tjBLqtBVWWMHNOuusYvhNuYmHMPjw4jvxwy6xIYB3cGOBvRx54zmMFEAJFS+/8Q+22267Oc7WU1cYxx9/vNt///0dizV8iBE/NnCUF5DGooIwvK+e6iu1iLN2XLYuYPMAbFaFFzOvzdVdel4/EkgAqn7qst1KwuC95JJLyiAGA5VYkMqKnokE2eI6gMkBpo+/3bp1k78Kpni+8847uxVXXFEmF+xH2K3G96Y+ePpu6jO272MM3Jafts5/HH+ePAiz5ppriuyXWWYZmfzVNqyyrWH02GJD6YsvvljaBXZhXHiLJ18wTRqWMsAKYfiPXy8untG2YHcAXpQJhgm1Gb8VjAwdOlTYKf4q6wLjhB8vtV/r0aOHm2+++cSHF8CeuFELArIAcbBXMGTkkbDnnHOOxAVDRntGDchigDwD3hTYwVgRBjUdOzSxmWMDAc+ROWCPMGxEqPRlmSX9DsOH6w09i9EC5vYCz5UuZ4pvzCWQANSYy66h34SBYuDTQTutwirXHJh8cA3AxMaqfemll5ZJR9kn/YtDSt0ezoTHZMZf3k+ftpUBslbjfeuXqT3VObpwYddkr1695IgRGB4YIkDVRBNNVDiQeb/99pNn2O+gTgMAoI6CwUFVR3kAOOoiwpaD54DFxRdfXAz4v/rqK/EJRljOIATgANjYoYltHvfZiLDddtu58cYbT1gq2C9UdDDWLA5mnnlmWXwB5rC34kL9R1vHJgoQxoKA8YX4AaeoHGEFsX2C2QJQwbrBPmGE3pRj0db0zhgI2QUiAAo2D5WmvdIisjUSrp+wCUDVT122a0nUiJwdU7oq5W9S4VWmGqwclQlA1qg+mBiZpDDSVdmn1W9l5K6x6IRY7i/hrEF7pSbvlpQib4LHoBvWD+/s7EgEQOMmAh9cgBzUdVzY7wDGsTWCUbILH4y7cTmh9+yOT+JHvQaIwuEpZYcJQnWMLRPG4bBAGILj5BQbrB133FFAHSAHpgjGCLBD2+XIns0331zUglzYMJE3QBN5B+BhNE4YgBn9ARsqQNbLL78sgArv+Dh1xU6qkkf5lFsMaplh2vIcaSYQ1ZLWW19hEoCqr/psl9IwkLAahP6HKWnPVXe7FLBKEomNWe2uPGxVsD3RS59V0g9OlYih6rJhAUbc9tsbyGp9x0ec5Lm2gEkaPHiwO++880o8vQM+YKBQj7FhoVwbsvZF1kYo3i3KsxjQqFzYQYfqGVsmu5PQ5j9O38o0b6xpK+Ci6do0Yd5goBRA5YHZqmuwKUNtJoEEoNpMtPUdMZR+9+7dHdvq7aq9vkvd/qVj0stj9RjU9dPeuWoJO9OWeRrb9Mf2fVs2Wzftxb6Sf+uDKQYzsWsJzReqNAygUefxXS9Ufrg1gOHReInDgoO4bLFfqDzXE3mgngUXDBRG5bEPqpj5In96OHIeUInTrJQBedx2LRjleCPswawLEfJm1bht2fZT3NUlgQSgqqs+aiY3N954Y+HgVzu4tfcKvGYE1sqMlpsM8iaZJPNWCrcCwS1oib9XIPoWRaEAOo8pIYLYCBq7JOzqUJvxXS98LuH64MUXXyxsCCnXpmyc9niWOL289LkHWEPlB9uV55yzqbGkHKBry/EnThMVJmrJL774orCAiZniFlVeClQXEkgAqi6qsf0LARWPITneg/EoHQ+YeY4SWzvRx8dExKUsR+3r/XiVbt+3q3Sb96bUBUlV2f7tLKWYJDAuJWBZMvxSDRo0SM5gzBtL8kDkuMx7SrvtJZAAVNvLuO5SUBUIxqrsqJlppplkt4wONjE4QQCtsVOwqin7Xh77EoOacqoFrYT4KBQ9qsQOfnkr4wSe6q4ZpwIlCeRKQBlF7fPYG2Kojs0nuwTVdYMd72KVZxJtY0ggAajGqOeKltKyNFD/+IPBLxQ7cg466KDC0QoWlOSBqqYypQMSaSnowTmfXmqXwHPrs0aPhbDneGHvYW0+CI+vHM0TYWHUbPw8Z6cPYcqd81VRoabIkgSSBKpGAoAkdhnutNNO4joBp7Z8MLLnqgTDXjWFTRkZYwkkADXGomvsF+3OG7Yvc64Vvl3YnYdheWzgmWdkWk6CNm58wOD195VXXpGt1xhxAnTYVs12avzInHXWWeLj5rnnnpPT3M8880w5S4sLo1V80OAVWc/MwgaEnUhPPPGEeEmGPWN3zWmnnSbpkCbncJ100kkSp16JhWrsNp9K3xgSoJ8zLuAyZKqpphJ/U5wOoMDJ7hhMi6vGaBPlSpkAVGPX/xiXPlbJsSKD/YHJ0SMtYiPWltpA2ffwYDzFFFOI4zqc9M0zzzwC1gBP7IbBTwz+bg444ABZMT799NPi1I/fONzD+zJGq5wFBlu2++67i/NAzgLjjK3TTz9dWDMc5HFcBEc1YCSqx1vE/l4SiBrjJpNeTBKoKQmwCFP7zrxNHfH4VlOFS5mtiAQSgKqIGBsrEqv6siXX7bx50miNDRTvK9hiZxBndME6sfLDezIO/QBFHC7Kb2yx8G/DSfCo5ziKArqdM9c4OZ64UMcBxvCejnNBGCicBnK6PIbwE088sXwnvWmmmUbOFsMpIL8ZPMeVy4DGalmptEkC414CdlelzY2aFcQ+tmJ3DOO+BCkH7SWBBKDaS9J1mo61EVJgFdsHtJa1UfDEXzwac56WXjBFhx9+uKjYYKZgnVDfAXgAS1xPPfWUeGTGVxVgSS/ewQcNrBVevQFHHC2BB+ZjjjlGABmHpMI6wVaxZZmDYm3+28vXT502l1SsJIGakIA1Ochjn3RBaFn15MS2Jqq2oplMAKqi4mycyGLj6jxWKl6pjYkKD7slQM8pp5wiDBP2ThzlAMvEfbYUEy9sEYwSajvUcvi7wXZq/PHHlyNPYKmwbUIFyK5BDiAlbkAUYTku4sADD5SjIbCzwi6KA0/1uBRqtrVAsHFaQyppkkB9SSDu65ZBjxdUaVyor7pvTWkSgGqNtFLYdpUAg9Y777wjB5ICcmCjOMiUAQvwgzNPnnNhq8A5WxxQSjjddccZXPfcc48AKw4cxficLcmwVKj1cOzHWV2AMkATzwFXxANLRRi9WgoA21VIKbEkgSSBJIEkgXEigQSgxonYU6JIIPYgnOdRGBXbXHPNNdquPuumwPp2ygM5bEmOw8TnyMV2D+rrRZmnpuy7Um0mCSQJJAkkCTSeBBKAarw6r4oSN2VUbkHQscceK6o6To63dgnWTsoyRFaVaOMpdzSKHkehQEn/ttZvVVUINWUiSSBJIEkgSaDdJJAAVLuJOiVkgU5L1GGwTKjacFmACs6CHL4r+MnzAqwATY2+rW+p2GM6ccWHgZaza2irA0tT60gSSBJIEkgSqC0JJABVW/XVELnN8zGlwKUcsMlz1Kkgzb6Tt0U5T3VowVpePA1REamQSQJJAkkCSQJlJZAAVGoc41QCeao87uElHAeXGHXrFYMozqyL3QpofM0dtZC35Th2w5DnviAxUOO0uaTEkwSSBJIEqkYCCUBVTVU0TkasD5VYlaeghV12U089tbgu0DDWcJzdcXgTZxdefKinquT4y7v26IWYWVJ3DLEbBs2jHiyctio3TvtMJU0SSBJIEmiJBBKAaomUUph2kQDsDrvjcCtw/fXXu+mmm84988wzAoJgojiPClcFgBrcGnTv3t2dcMIJkrfhw4eLofl9993nOJtPgRIACzcGAC68mfPsiy++EOeb2FUByniGSwR8QvGbc7A4TBhXBoA0XB3gGuHiiy92P/74Y7vIIiWSJJAkkCSQJFDdEkgAqrrrp25zl8foAGo4ogWP4ksuuaTsvgO44FKAo1fwLN61a1fx44STTJ7jLZzz95588km35ZZbui5durjLL79cduwRjkOC99hjD3GeiRNOzsjjnf3220/u4y+Kc/ZwoNm7d2+H36iTTz5ZwuDxvFu3bnJMzGGHHSZOOddaa63RGK1kI1W3zTQVLEkgSSBJoKwEEoBKjaPdJRC7IADswD5xdh0HBXPh2JIz6ZSBwiYKb+H/93//57beemsBOp07d5YjWHgfpgkWinPzFl544cJ3jm/hWadOndwhhxzibr/9djf99NO7Bx54QMLANgHcnnvuOQFk2223nRwTM3DgQPfpp58Kq6VuFNgRSDzkhYtyWJuodMxLuzellGCSQJJAksA4k0ACUONM9I2dsGVt1EnlzDPP7M444wxRowFqOAMPYMMRLICf559/3u25555um222ke+AnDvvvFM8iHOkCyq32WefXd7DAefSSy8t8T377LMCuvBEjm0Vx7689dZbUgE8Q134yiuvuAEDBshBxagLN9lkEwFXfOcAYlSDqPUAU6j70pUkkCSQJJAk0NgSSACqset/nJXe+mXSTABsOKsOdglABFh544033N577y1sEwCJw34Jx9l2PD/zzDPlnDwOE37sscfcDDPM4CabbDKxdcJOCpXbddddJ0AJ2ykOCkZdh50VF+ffrbTSSuJvivjWWWcdYayWWmopsZlS9gpjdsAXDBSAy7pDsF7Kk7H5OGtSKeEkgSSBJIF2lUACUO0q7pQYEoidW+qxKe+//75baKGF3AYbbCCgCKAEmAK8TDrppO64445zhx56qKj5MARfeeWV3V577SXPAVY8w06KDwDqiCOOEPulLbbYwi266KJu3333FSP0TTfdVGymuABZyyyzjBwaTBwcJIx67//bu4PbBmEoAMN3BmIX5skwubAHd8aIskOr35KrV8utSAQiNj9SDi1gzGcOT/azPU1TGsJbliX1dDFsx5AfuVkMA+YjLuK5ZXFQvwAFFFBAgT4EDKD6aMfm3iIHHrHHhnwiAh96g1h6gBlv9PpwMJTGsBz/Z5NfruX8uq7pPMNrDOUx7PZ4PL7u93sayqPHidl25FcNw/AzA4/yciDHECE/EsrZlJhy6Hl6Pp9phh7nKDM/J9epOXQrrIACCiiwm4AB1G6UFrRVoEy2JoiqrSROeXHxzJiwXfb2xLWiuI/AaRzHtAwByxOwBMHtdktVjPfGupR1KLeIicFerHMcwjORfOtX4HUKKKBA2wIGUG23X7O1J9CIG/bWNgfOAVNcrbwWaNVWIweGmXwETvM8pxl8JJHnIwZRtbylcvuXCF0GUs02ghVXQAEFFHhbwADqbTpv/HQBAh0W5uRncvent5b1U0ABBdoSMIBqq72s7YsCcfuXF2/1cgUUUEABBf4UMIDy4+hSoDYjzllyXTa1L6WAAgqcImAAdQq7Dz1aIOZN8azy76Ofb/kKKKCAAn0LGED13b6+nQIKKKCAAgocIGAAdQCqRZ4rEIfqaj1R59bOpyuggAIK9CBgANVDK/oOvwT+y3UyD8qPRQEFFFBgDwEDqD0ULUMBBRRQQAEFLiVgAHWp5vZlFVBAAQUUUGAPAQOoPRQtQwEFFFBAAQUuJfANMQi/EPjvz9YAAAAASUVORK5CYII=" alt="" />
IO多路复用是事件驱动型,使用select()对整个进程进行轮询
1.用户调用select模块,整个进程阻塞
2.内核态监控socket的状态,有数据时返回给select
3.select接收到数据后返回给系统
4.系统收到select数据命令后,系统调用内核拷贝数据给程序
select的优势在于可以处理多个连接,不适用于单个连接
12,threading中Lock和RLock的相同点和不同点
Lock是互斥锁
Rlock是递归锁
相同点:互斥锁和递归锁的目的都是牺牲运行效率,将并行改为串行来实现数据共享的安全性,当一个进程(线程)拿到锁才能操作数据,操作完成后释放锁才能给其它进程(线程)使用
不同点:互斥锁会发生死锁现象,就是两个或以上的进程(线程)在争夺资源时互相等待,互相都不释放手中的锁让其他进程(线程)拿,递归锁就是互斥锁加计数器,所有进程(线程)都可以拿到锁,每有一个进程(线程)拿到锁就计数加一,直到该线程释放计数器的所有锁的计数,其他进程(线程)才能再操作。
递归锁可以连续acquire多次,而互斥锁只能acquire一次
13、什么是select,请简述它的工作原理,简述它的优缺点;
select模块是python的IO多路复用的使用模块
select模块通过提供文件描述符给内核态,当没有文件描述符的时候,进程的执行被阻塞,当select提供文件描述符的时候,就交给内核态去拷贝数据
优点 只用一个单进程(线程)执行,占用的CPU资源少,能实现简单的socket多客户端的通信
缺点 如果文件描述符过大(数值过大轮询耗时间)的时候,select需要花大量的时间去处理;事件的探测和事件响应杂糅,事件响应体庞大的时候将影响整个模型。
14、什么是epoll,请简述它的工作原理,简述它的优缺点;
epoll是linux的IO多路复用的使用模块
1.epoll首先会通过linux(unix)系统申请一个简易的文件系统,建立这个epoll对象
2.在epoll里添加或删除连接
3.epoll里的wait收集正在发生事件的连接
优点 epoll的大并发效果更好,不像select那样去遍历句柄,而是利用内部的算法(红黑树增删连接、双向链表rdlist存储描述符使调用更高效)
缺点 epoll只兼容linux和unix
15、简述select和epoll的区别;
select 是通过轮询的方式监听句柄,遍历句柄给内核做系统调用,并且有个数限制1024个
epoll 不采用轮询的方式监听文件描述符,用共享内存、红黑树和双向链表,采用回调的方式给内核做系统调用
select兼容性比epoll好,epoll只适用于linux和unix
16、简述多线程和多进程的使用场景;
多线程使用于IO密集型,因为多线程占用CPU资源少、创建速度快共享内存间地址的数据
多进程使用于计算密集型,可以利用多核的优势并发执行CPU计算
17,请分别简述threading.Condition、threading.event、threading.semaphore的使用场景;
Condition 条件执行,控制复杂的线程同步问题,把锁作为参数传入控制锁的挂起和释放
event 事件执行,简单的线程同步,用标识符设置为evect后其他线程就阻塞
semaphore 设置线程的最大连接数的限制(递归锁原理)
18、假设有一个名为threading_test.py的程序里有一个li = [1, 2, 3, 4]的列表,另有a,b两个函数分别往该列表中增加元素,a函数需要修改li之前需要获得threading.Lock对象,b函数不需要,请问当线程t1执行a函数获取到Lock对象之后并没有release该对象的情况下,线程t2执行b函是否可以修改li,为什么?
可以,因为线程间本身就是数据共享的,虽然线程t1加了锁,但是线程t2没有加锁,不受锁的限制,可以直接修改数据
19、简述你对Python GIL的理解;
GIL全局解释锁是建立在python解释器级别的一把互斥锁,目的是用来处理python内部的垃圾回收机制
有了GIL的全局解释锁就让python一次只能执行一个任务代码,并不能实现真正多线程的执行任务
20、什么是同步I/O,什么是异步I/O?
同步I/O 做IO操作的时候会发生阻塞的就是同步IO
典型模型:阻塞IO、非阻塞IO、多路复用IO
异步I/O 做IO操作的时候不会发生阻塞
典型模型:异步IO
所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用
所谓异步,当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区别
21,什么是管道,如果两个进程尝试从管道的同一端读写数据,会出现什么情况?
管道是socket套接字间的一种通信方式
管道是数据单向性的,读数据的时候不能进行写数据操作,写数据的时候不能进行读数据操作
22,为什么要使用线程池/进程池?
计算机虽然能够使用多进程或多线程,但是每次执行的个数实际是收到CPU的核数限制的,即便开启了多个进程也不能超过核数的去执行,所以要设置进程池来保证进程执行个数
23,如果多个线程都在等待同一个锁被释放,请问当该锁对象被释放的时候,哪一个线程将会获得该锁对象?
操作系统为线程分配锁的机制
24,import threading;s = threading.Semaphore(value=-1)会出现什么情况?
抛出异常ValueError: semaphore initial value must be >= 0,数值必须大于0
25,请将二进制数10001001转化为十进制;
1*2^7 + 1*2^3 + 1*2^0 = 137
26,某进程在运行过程中需要等待从磁盘上读入数据,此时该进程的状态将发生什么变化?
aaarticlea/png;base64,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" alt="" />
当进程在执行的过程中遇到IO操作的时候就会从执行的状态跳转至阻塞状态,直到IO操作结束,才会将阻塞调度到就绪状态
27,请问selectors模块中DefaultSelector类的作用是什么;
DefaultSelector会根据python中的os模块提出操作系统,选择最优的接口( select/poll/epoll)
28,简述异步I/O的原理;
用户进程发起read操作之后,立刻就可以开始去做其它的事。而另一方面,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了
29,请问multiprocessing模块中的Value、Array类的作用是什么?举例说明它们的使用场景
Value和Array类实现的是共享内存的作用,一般来说进程与进程之间是不能互相共享数据的,但是使用了Value和Array以后就能实现进程间的数据共享
import multiprocessing
def f(n, a):
n.value = 3.14
a[0] = 5
if __name__ == '__main__':
num = multiprocessing.Value('d', 0.0)
arr = multiprocessing.Array('i', range(10))
p = multiprocessing.Process(target=f, args=(num, arr))
p.start()
p.join()
print (num.value)
print (arr[:])
这里我们实际上只有主进程和Process对象代表的进程。我们在主进程的内存空间中创建共享的内存,也就是Value和Array两个对象。对象Value被设置成为双精度数(d), 并初始化为0.0。而Array则类似于C中的数组,有固定的类型(i, 也就是整数)。在Process进程中,我们修改了Value和Array对象。回到主程序,打印出结果,主程序也看到了两个对象的改变,说明资源确实在两个进程之间共享
30,请问multiprocessing模块中的Manager类的作用是什么?与Value和Array类相比,Manager的优缺点是什么
Manager对象比Value和Array实现更多的共享数据类型
Manager对象类似于服务器与客户之间的通信 (server-client),与我们在Internet上的活动很类似。我们用一个进程作为服务器,建立Manager来真正存放资源。其它的进程可以通过参数传递或者根据地址来访问Manager,建立连接后,操作服务器上的资源。在防火墙允许的情况下,我们完全可以将Manager运用于多计算机,从而模仿了一个真实的网络情境。下面的例子中,我们对Manager的使用类似于shared memory,但可以共享更丰富的对象类型
Manager类的作用共享资源,manger的的优点是可以在poor进程池中使用,缺点是windows下环境下性能比较差,因为windows平台需要把Manager.list放在if name='main'下,而在实例化子进程时,必须把Manager对象传递给子进程,否则lists无法被共享,而这个过程会消耗巨大资源,因此性能很差
31,请说说你对multiprocessing模块中的Queue().put(), Queue().put_nowait(), Queue().get(), Queue().get_nowait()的理解;
q = Queue(3) 队列 先进先出 进程间通信; 队列 = 管道 + 锁
q.put()
q.put_nowait() # 无阻塞,当队列满时,直接抛出异常queue.Full
q.get()
q.get_nowait() # 无阻塞,当队列为空时,直接抛出异常queue.Empty
32,什么是协程?使用协程与使用线程的区别是什么?
协程:是单线程下的并发,又称微线程,纤程。英文名Coroutine。
协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的
一个线程可以多个协程,一个进程也可以单独拥有多个协程,这样python中则能使用多核CPU
线程进程都是同步机制,而协程则是异步
协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态
33,asyncio的实现原理是什么?
asyncio的编程模型就是一个消息循环。我们从asyncio模块中直接获取一个EventLoop的引用,然后把需要执行的协程扔到EventLoop中执行,就实现了异步IO。
34.如何获取多线程的返回结果
将线程放入队列中,实例化队列Queue->开启线程->放线程进入队列->提取队列中的线程
队列的三种方式(先进先出,后进先出(堆栈),设置优先级)
35.GIL锁造成的后果是什么
GIL锁的后果就是在cpython中实际上是基于解释器上的互斥锁,导致每次运行的时候只能单线程的运行,并不能实现多线程运行,只不过在遇到IO操作的线程的时候GIL锁就会释放锁(不提供锁),让其他的线程去执行,所以在读写和写入方面GIL锁的限制就小很多,但是计算密集型的时候还是只能单线程的运行。
36.多线程的适合什么场景?为什么线程不能操作CPU?
多线程适用于IO操作密集型,因为其开销小占用资源少,启动快的特性,并且在单进程内的多线程是实现内存数据共享的,
线程是进程的基本组成单位,进程是CPU的资源单位,单个或多个线程才能组成进程,所以说线程是不能直接操作CPU的。
37.为什么要有互斥锁?
互斥锁是为了在多进程(线程)的情况下,为了数据共享的安全性,牺牲了运行的效率(并行变为串行)而实现同一个时刻内,只允许有一个进程(线程)操作数据
二、编程题
1、请写一个包含10个线程的程序,主线程必须等待每一个子线程执行完成之后才结束执行,每一个子线程执行的时候都需要打印当前线程名、当前活跃线程数量;
from threading import Thread,currentThread,activeCount
import random
import time
def task():
print('正在运行的线程%s'%currentThread().getName())
start = time.time()
time.sleep(random.randint(1,5))
stop = time.time()
print('任务执行时间%sS'%(stop-start))
print('当前活跃的线程数%s'%activeCount())
if __name__ == '__main__':
# 并发版
t_l = []
for i in range(10):
t = Thread(target=task)
t.start()
t_l.append(t)
for t in t_l:
t.join()
print('主线程%s结束'%currentThread().getName())
# 串行版
# for i in range(10):
# t = Thread(target=task)
# t.start()
# t.join()
# print('主线程%s结束' % currentThread().getName())
2、请写一个包含10个线程的程序,并给每一个子线程都创建名为"name"的线程私有变量,变量值为“james”
# 2、请写一个包含10个线程的程序,并给每一个子线程都创建名为"name"的线程私有变量,变量值为“james”
from threading import Thread,currentThread
import random
import time
def task():
start = time.time()
print('线程%s启动!'%currentThread().getName())
time.sleep(random.randint(1,2))
stop = time.time()
print('任务的执行时间%s'%(stop - start))
if __name__ == '__main__':
# 线程不再写串行版,自行脑补
t_l = []
for i in range(10):
t = Thread(target=task, name='james—%s'%i)
t_l.append(t)
t.start()
for t in t_l:
t.join()
print('主线程结束')
3、请使用协程写一个消费者生产者模型;
'''
两个注意点
1.gevent.spawn内部是传函数地址,别传函数(),参数写函数地址后面
2.队列拿前判断下是不是空 q.empty()
'''
from multiprocessing import Queue
import time
import random
from gevent import monkey;monkey.patch_all()
import gevent
from threading import currentThread
def producer(q,i):
start = time.time()
print('开始生产')
time.sleep(random.randint(1,2))
res = '机器人%s号'%i
stop = time.time()
print('生产者生产了机器人%s号,花费时间%s' % (i, (stop - start)))
# print(currentThread().getName())
q.put(res)
def consumer(q):
while not q.empty():
start = time.time()
print('开始消费')
time.sleep(random.randint(1,2))
stop = time.time()
res = q.get()
# print(currentThread().getName())
print('消费者消费了%s,花费时间%s' % (res, (stop - start)))
if __name__ == '__main__':
q = Queue()
for i in range(10):
gevent.joinall([gevent.spawn(producer,q,i), gevent.spawn(consumer,q)])
print('主进程结束')
4、写一个程序,包含十个线程,子线程必须等待主线程sleep 10秒钟之后才执行,并打印当前时间;
from threading import Event,Thread,currentThread
import time
import random
def task():
start = time.time()
time.sleep(random.randint(1,4))
stop = time.time()
print('线程-%s运行的时间%s'%(currentThread().getName(),stop-start))
print(time.strftime('%Y-%m-%d %X'))
if __name__ == '__main__':
event = Event()
event.wait(10)
for i in range(10):
t = Thread(target=task)
t.start()
5、写一个程序,包含十个线程,同时只能有五个子线程并行执行;
from threading import Thread,currentThread
from concurrent.futures import ThreadPoolExecutor
import time
import random
def task():
start = time.time()
time.sleep(random.randint(1,4))
stop = time.time()
print('程序运行时间%s'%(stop-start))
print('线程的名称%s'%currentThread().getName())
if __name__ == '__main__':
ex = ThreadPoolExecutor(max_workers=5)
for i in range(10):
ex.submit(task)
ex.shutdown(True)
6、写一个程序 ,包含一个名为hello的函数,函数的功能是打印字符串“Hello, World!”,该函数必须在程序执行30秒之后才开始执行(不能使用time.sleep());
from threading import Timer
def hello():
print("hello, world")
t = Timer(30, hello)
t.start()
7、写一个程序,利用queue实现进程间通信;
from multiprocessing import Queue,Process
import time
import random
def produce(q,i):
start = time.time()
time.sleep(random.randint(1,2))
stop = time.time()
print('悄悄地拿到了%s,耗时%s'%(i,(stop-start)))
q.put(i)
def consumer(q):
while not q.empty():
start = time.time()
res = q.get()
time.sleep(random.randint(1,2))
stop = time.time()
print('悄悄的亲了下%s,耗时%s'%(res,(stop-start)))
if __name__ == '__main__':
q = Queue()
p = Process(target=produce,args=(q,'小宝贝',))
c = Process(target=consumer, args=(q,))
p.start()
p.join()
c.start()
c.join()
print('主进程结束')
8、写一个程序,利用pipe实现进程间通信;
from multiprocessing import Process, Pipe
def task(conn):
conn.send('hello world')
conn.close()
if __name__ == "__main__":
parent_conn, child_conn = Pipe()
p = Process(target=task, args=(child_conn,))
p.start()
p.join()
print(parent_conn.recv())
9、使用selectors模块创建一个处理客户端消息的服务器程序;
10、使用socketserver创建服务器程序时,如果使用fork或者线程服务器,一个潜在的问题是,恶意的程序可能会发送大量的请求导致服务器崩溃,请写一个程序,避免此类问题;
11、请使用asyncio实现一个socket服务器端程序;
12、写一个程序,使用socketserver模块,实现一个支持同时处理多个客户端请求的服务器,要求每次启动一个新线程处理客户端请求;
- 路飞学城Python-Day40(第四模块复习题)
数据库 一.简答题 1.说说你所知道的MySQL数据库存储引擎,InnoDB存储引擎和MyISM存储引擎的区别? 1.InnoDB存储引擎(MySQL默认存储引擎),支持事务,其设计目标主要面向联机事 ...
- 路飞学城Python-Day29(第四模块-并发编程)
01-进程与程序的概念 并发:多进程和多线程 进程的概念:进程就是正在执行的过程,一个应用程序不是进程,只有应用程序启动以后才能说是进程,进程是一个抽象的概念,起源于操作系统 02-操作系统介绍 应用 ...
- 路飞学城—Python爬虫实战密训班 第三章
路飞学城—Python爬虫实战密训班 第三章 一.scrapy-redis插件实现简单分布式爬虫 scrapy-redis插件用于将scrapy和redis结合实现简单分布式爬虫: - 定义调度器 - ...
- 路飞学城—Python爬虫实战密训班 第二章
路飞学城—Python爬虫实战密训班 第二章 一.Selenium基础 Selenium是一个第三方模块,可以完全模拟用户在浏览器上操作(相当于在浏览器上点点点). 1.安装 - pip instal ...
- 路飞学城Python爬虫课第一章笔记
前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 之前看阮一峰的博客文章,介绍到路飞学城爬虫课程限免,看了眼内容还不错,就兴冲冲报了名,99块钱满足以下条件会返还并送书送视频. 缴 ...
- 路飞学城-Python开发集训-第4章
学习心得: 学习笔记: 在python中一个py文件就是一个模块 模块好处: 1.提高可维护性 2.可重用 3.避免函数名和变量名冲突 模块分为三种: 1.内置标准模块(标准库),查看所有自带和第三方 ...
- 路飞学城-Python开发集训-第3章
学习心得: 通过这一章的作业,使我对正则表达式的使用直接提升了一个level,虽然作业完成的不怎么样,重复代码有点多,但是收获还是非常大的,有点找到写代码的感觉了,遗憾的是,这次作业交过,这次集训就结 ...
- 路飞学城-Python开发集训-第2章
学习心得: 这章对编码的讲解超级赞,现在对于编码终于有一点认知了,但还没有大彻大悟,还需要更加细心的琢磨一下Alex博客和视频,以前真的是被编码折磨死了,因为编码的问题而浪费的时间很多很多,现在终于感 ...
- 路飞学城-Python开发集训-第1章
学习体会: 在参加这次集训之前我自己学过一段时间的Python,看过老男孩的免费视频,自我感觉还行,老师写的代码基本上都能看懂,但是实际呢?....今天是集训第一次交作业的时间,突然发现看似简单升级需 ...
随机推荐
- 51nod-活动安排问题之二
有若干个活动,第i个开始时间和结束时间是[Si,fi),活动之间不能交叠,要把活动都安排完,至少需要几个教室? 分析:能否按照之一问题的解法,每个教室安排尽可能多的活动,即按结束时间排序,再贪心选择不 ...
- Python 从入门到实践 - Web应用程序
一.创建项目 1.建立虚拟环境 python -m venv ll_env # 出现ll_env文件夹 2.激活虚拟环境 source ll_env/bin/activate # 要停止使用虚拟环境, ...
- redis_4 主从模式
配置主服务器: 进入 redis 配置文件redis.conf. 修改 bind 127.0.0.1 为 bind 0.0.0.0 关闭防火墙,只有root用户能操作 .开启 命令为:ufw enab ...
- 用2003版的Excel使用“宏”打开NMON软件生产的.nmon文件
用2003版的Excel使用“宏”打开NMON软件生产的.nmon文件 nmon analyser——生成 AIX 性能报告的免费工具,可从 NMON 的输出中生成大量的报告图形.nmon_analy ...
- 使用sdk自带工具uiautomatorviewer查看app控件属性
双击打开即可 其只显示模拟器中的当前页面,所以需要在模拟器中打开你需要的页面,然后刷新
- web.xml 中context-param元素
context-param元素含有一对参数名和参数值,用作应用的ServletContext上下文初始化参数.参数名在整个Web应用中必须是惟一的 param-name 子元素包含有参数名,而para ...
- Android开发之使用BroadcastReceiver实现开机自己主动启动(源码分享)
上一节已经介绍过BroadcastReceiver实现实时监听电量的功能,这节就来介绍一下假设实现开机自己主动启动的功能.这个比监听电量还简单不少 (1)在清单文件注冊权限 <uses-perm ...
- java多线程具体总结
一.Thread.start()与Thread.run()的差别 通过调用Thread类的start()方法来启动一个线程.这时此线程是处于就绪状态,并没有运行.然后通过此Thread类调用方法run ...
- 解惑rJava R与Java的快速通道
阅读导读: 1.什么是RJava? 2.怎样安装RJava? 3.怎样用RJava实现R调用Java? 1. rJava介绍 rJava是一个R语言和Java语言的通信接口.通过底层JNI实现调用,同 ...
- Bash脚本中的操作符
一.文件測试操作符 假设以下的条件成立将会返回真. -e 文件存在 -a 文件存在 这个选项的效果与-e同样. 可是它已经被"弃用"了, 而且不鼓舞使用. -f 表示这个文件是一个 ...