#提交任务的两种方式
#1、同步调用:提交完任务后,就在原地等待任务执行完毕,拿到结果,再执行下一行代码,导致程序是串行执行

一、提交任务的两种方式

1、同步调用:提交任务后,就在原地等待任务完毕,拿到结果,再执行下一行代码,导致程序串行执行

from concurrent.futures import ThreadPoolExecutor
import time
import random
def produce(name):
print('%s is producing' %name)
time.sleep(random.randint(3,5))
res=random.randint(7,13)*'#'
return {'name':name,'res':res} def number(commodity):
name=commodity['name']
size=len(commodity['res'])
print('%s 制造了 《%s》件商品' %(name,size)) if __name__ == '__main__':
pool=ThreadPoolExecutor(13) p1=pool.submit(produce,'alex').result() # 取得返回的结果
number(p1) p2=pool.submit(produce,'wupeiqi').result()
number(p2) p3=pool.submit(produce,'yuanhao').result()
number(p3) alex is producing
alex 制造了 《12》件商品
wupeiqi is producing
wupeiqi 制造了 《12》件商品
yuanhao is producing
yuanhao 制造了 《11》件商品

2、回调函数--异步调用:提交完任务后,不用原地等待任务执行完毕,

from concurrent.futures import ThreadPoolExecutor
import time
import random
def produce(name):
print('%s is producing' %name)
time.sleep(random.randint(3,5))
res=random.randint(7,13)*'#'
return {'name':name,'res':res} def number(commodity):
commodity = commodity.result()
name=commodity['name']
size=len(commodity['res'])
print('%s 制造了 《%s》件商品' %(name,size)) if __name__ == '__main__':
pool=ThreadPoolExecutor(13)
pool.submit(produce,'alex').add_done_callback(number)
pool.submit(produce,'wupeiqi').add_done_callback(number)
pool.submit(produce,'yuanhao').add_done_callback(number) alex is producing
wupeiqi is producing
yuanhao is producing
yuanhao 制造了 《9》件商品
alex 制造了 《8》件商品
wupeiqi 制造了 《12》件商品

3、进程池线程池小练习

我们在浏览器上输入一个网址,就能看到一个页面内容,中间经历了那些过程呢:

浏览器本质套接字客户端,套接字服务端在站点,服务器主机上,把目标文件下载到本机

3.1 提取网页信息(回调函数)

# import requests,time
# requests = requests.get('https://www.cnblogs.com/foremostxl/p/9734442.html')
# print(requests.text) from concurrent.futures import ThreadPoolExecutor
import requests,time
def get(url):
request = requests.get(url)
time.sleep(3)# 模拟网络延迟
return {'url':url,'content':request.text}
def parse(res):
res = res.result()
print('%s parse res is %s' % (res['url'], len(res['content'])))
if __name__ == '__main__':
urls=[
'http://www.cnblogs.com/foremostxl',
'https://www.python.org',
'https://www.baidu.com',
]
pool = ThreadPoolExecutor(3)
for url in urls:
pool.submit(get,url).add_done_callback(parse) http://www.cnblogs.com/foremostxl parse res is 13105
https://www.baidu.com parse res is 2443
https://www.python.org parse res is 49097

3.2 基于线程池实现套接字通信

服务端:

import socket
from concurrent.futures import ThreadPoolExecutor
def Server(ip_port):
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(ip_port)
server.listen(5)
while True:
conn ,addr = server.accept()
pool.submit(communicate,conn)
server.close()
def communicate(conn):
while True:
try:
data = conn.recv(1024)
conn.send(data.upper())
except Exception as e:
print(e)
break
conn.close() if __name__ == '__main__':
ip_port = ('127.0.0.1',8080)
pool = ThreadPoolExecutor(2)
Server(ip_port)

客户端:

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
ip_port = ('127.0.0.1',8080)
client.connect(ip_port)
while True:
msg = input('>>').strip()
if not msg:break
client.send(msg.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8'))
client.close()

13 并发编程-(线程)-异步调用与回调机制&进程池线程池小练习的更多相关文章

  1. Python Django 协程报错,进程池、线程池与异步调用、回调机制

    一.问题描述 在Django视图函数中,导入 gevent 模块 import gevent from gevent import monkey; monkey.patch_all() from ge ...

  2. 并发编程 - 线程 - 1.线程queue/2.线程池进程池/3.异步调用与回调机制

    1.线程queue :会有锁 q=queue.Queue(3) q.get() q.put() 先进先出 队列后进先出 堆栈优先级队列 """先进先出 队列"& ...

  3. C#并发编程之异步编程2

    C#并发编程之异步编程(二)   写在前面 前面一篇文章介绍了异步编程的基本内容,同时也简要说明了async和await的一些用法.本篇文章将对async和await这两个关键字进行深入探讨,研究其中 ...

  4. NET中级课--浅谈委托,事件,异步调用,回调等概念

    直接说题. 委托         首先明确它是什么,其实就是一个类,定义一个委托即定义一个类,那么它是什么类?用来说明方法的类型的类.字段有类型,那么方法其实也有类型,就是委托.       委托是某 ...

  5. 【并发编程】一个最简单的Java程序有多少线程?

    一个最简单的Java程序有多少线程? 通过下面程序可以计算出当前程序的线程总数. import java.lang.management.ManagementFactory; import java. ...

  6. 并发编程学习笔记(3)----synchronized关键字以及单例模式与线程安全问题

    再说synchronized关键字之前,我们首先先小小的了解一个概念-内置锁. 什么是内置锁? 在java中,每个java对象都可以用作synchronized关键字的锁,这些锁就被称为内置锁,每个对 ...

  7. 重点:怎样正确的使用QThread类(很多详细例子的对比,注意:QThread 中所有实现的函数是被创建它的线程来调用的,不是在线程中)good

    背景描述: 以前,继承 QThread 重新实现 run() 函数是使用 QThread唯一推荐的使用方法.这是相当直观和易于使用的.但是在工作线程中使用槽机制和Qt事件循环时,一些用户使用错了.Qt ...

  8. C#并发编程-2 异步编程基础-Task

    一 异步延迟 在异步方法中,如果需要让程序延迟等待一会后,继续往下执行,应使用Task.Delay()方法. //创建一个在指定的毫秒数后完成的任务. public static Task Delay ...

  9. 【憩园】C#并发编程之异步编程(三)

      写在前面 本篇是异步编程系列的第三篇,本来计划第三篇的内容是介绍异步编程中常用的几个方法,但是前两篇写出来后,身边的朋友总是会有其他问题,所以决定再续写一篇,作为异步编程(一)和异步编程(二)的补 ...

随机推荐

  1. js取整,保留小数位数、四舍五入、科学记数法及去掉数字末尾多余的0

    1.向下取整 var num1 = 12.10345; var num2 =12.9801; var newnum1=Math.floor(num1)     //结果 12 var newnum2= ...

  2. python学习笔记(六)---sublime text3 创建python项目

    1.创建项目 依次鼠标左键点击Project>Add Folder to Project...,选择test文件夹: 2.保存项目 依次鼠标左键点击Project>Save Project ...

  3. IIS7 部署 MVC3

    IIS7 部署 MVC3 (2013-02-28 11:06:39) 转载▼ 标签: iis7 mvc3 it 分类: ASP.NET 在IIS7下部署MVC已经简化了许多,基本按照一般的项目部署即可 ...

  4. WIN8.1 PRO RTM VOL.2013.09.18

    文件名:cn_windows_8_1_pro_vl_x64_dvd_2791218.isoSHA1:61C002551763E22B64EB1BACEFFE83620114C3D6 文件名:cn_wi ...

  5. Android Studio 编译报错:Process 'command 'D:\SDK\AS\sdk\build-tools\23.0.0\aapt.exe'' finished with non-zero exit value 1

    AGPBI: {"kind":"error","text":"No resource identifier found for a ...

  6. 使用Junit进行Java单元测试

    1.新建一个Number类,该类中包含两个函数,求和.求差 2.在eclipse上安装Junit 右键test工程,选择“Properties”→“Java Build Path”→“Librarie ...

  7. Git 将代码恢复到一个历史的版本

    Git 将代码恢复到一个历史的版本 要把代码回到某个历史版本 比如 test有两种方法 暴力的方式 如果你的仓库是自己在用(不影响别人),那么你可以使用 git reset --hard <ta ...

  8. L3-014 周游世界 (30 分)

    周游世界是件浪漫事,但规划旅行路线就不一定了…… 全世界有成千上万条航线.铁路线.大巴线,令人眼花缭乱.所以旅行社会选择部分运输公司组成联盟,每家公司提供一条线路,然后帮助客户规划由联盟内企业支持的旅 ...

  9. 优先队列底层实现是堆(heap)(操作系统进程调度)

    只有一个CPU的情况下,比如作业系统中的调度程序,当一个作业完成后,需要在所有等待调度的作业中选择一个优先级最高的作业来执行(删除),并且也可以添加一个新的作业到作业的优先队列中(插入). 插入操作 ...

  10. flow 编写flow-typed 定义(官方文档)

    此为官方文档,因为墙的问题,记录下来: Before spending the time to write your own libdef, we recommend that you look to ...