2018-7-19 21:39:49 我觉得这次的笔记是非常非常完美的!!!明天继续 睡觉去啦!

傍黑时候和晴宝打电话,她特能说,很喜欢这种感觉,有好多东西要和你分享!

1.复习!

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 10:12
  4. # !@Author TrueNewBee
  5.  
  6. # 今天和明天 多线程
  7. # 协程 + IO模型
  8.  
  9. # 进程池所有内容:
  10. # 管道
  11. # 数据的共享 Manager dic list
  12. # 进程池
  13. # cpu个数+1
  14. # ret = map(func, iterable)
  15. # 异步 自带close和join
  16. # 所有结果的[]
  17. # apply()
  18. # 同步的 : 只有当func执行完之后,才会继续向下执行其他的代码
  19. # apply(func, args=())
  20. # 返回值就是func的return
  21. # apply_async
  22. # 异步的:当func被注册进入一个进程之后,程序就继续向下执行
  23. # apply_async(func, args())
  24. # 返回值: apply_async返回的对象
  25. # 为了用户能从中获取func的返回对象 obj.get()
  26. # get会阻塞直到对应的func执行完毕拿到结果
  27. # 使用apply_async给进程池分配任务,需要线close()后join来保持多进程和主进程代码的同步性

2.回调函数

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 10:22
  4. # !@Author TrueNewBee
  5.  
  6. # 回调函数
  7. from multiprocessing import Pool
  8.  
  9. def func1(n):
  10. return n+1
  11.  
  12. def func2(m):
  13. print(m)
  14.  
  15. if __name__ == '__main__':
  16. p = Pool(5)
  17. for i in range(10, 20):
  18. p.apply_async(func1, args=(i, ), callback=func2)
  19. p.close()
  20. p.join()

3.爬取数据例子

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 10:40
  4. # !@Author TrueNewBee
  5. import requests
  6. from multiprocessing import Pool
  7. # 200 网页正常
  8. # 404 网页找不到了
  9. # 502 504
  10. # 回调函数在主进程进行,因为是异步,不让主进程闲着,多做点东西!
  11.  
  12. def get(url1):
  13. response = requests.get(url1)
  14. if response.status_code == 200:
  15. return url1, response.content.decode('utf-8')
  16.  
  17. def call_back(args):
  18. url2, content = args
  19. print(url2, len(content))
  20.  
  21. url_list = [
  22. 'https://www.cnblogs.com/',
  23. 'http://www.baidu.com/',
  24. 'http://www.jd.com/'
  25. ]
  26.  
  27. if __name__ == '__main__':
  28. p = Pool(5)
  29. for url in url_list:
  30. p.apply_async(get, args=(url,), callback=call_back)
  31. p.close()
  32. p.join()

4.爬虫

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 11:23
  4. # !@Author TrueNewBee
  5.  
  6. # 爬取猫眼榜单数据,使用了线程池回调函数
  7. import re
  8. from urllib.request import urlopen
  9. from multiprocessing import Pool
  10.  
  11. def get_page(url,pattern):
  12. response = urlopen(url).read().decode('utf-8')
  13. return pattern, response # 正则表达式编译结果 网页内容
  14.  
  15. def parse_page(info):
  16. pattern, page_content = info
  17. res = re.findall(pattern, page_content)
  18. for item in res:
  19. dic = {
  20. 'index': item[0].strip(),
  21. 'title': item[1].strip(),
  22. 'actor': item[2].strip(),
  23. 'time': item[3].strip(),
  24. }
  25. print(dic)
  26.  
  27. if __name__ == '__main__':
  28. # 正则要写的好
  29. regex = r'<dd>.*?<.*?class="board-index.*?>(\d+)</i>.*?title="(.*?)".*?class="movie-item-info".*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>'
  30. pattern1 = re.compile(regex, re.S)
  31.  
  32. url_dic = {
  33. 'http://maoyan.com/board/7':pattern1,
  34. }
  35.  
  36. p = Pool()
  37. res_l = []
  38. for url, pattern in url_dic.items():
  39. res = p.apply_async(get_page, args=(url, pattern), callback=parse_page)
  40. res_l.append(res)
  41. for i in res_l:
  42. i.get()

5.线程

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 15:50
  4. # !@Author TrueNewBee
  5.  
  6. # import os
  7. # import time
  8. # from threading import Thread
  9. # """多线程并发,都在同一个进程运行"""
  10. #
  11. #
  12. # def func(n):
  13. # time.sleep(1) # 全部线程并发睡1s 然后打印
  14. # print(n, os.getpid())
  15. #
  16. #
  17. # print('主线程:', os.getpid())
  18. # for i in range(10):
  19. # t = Thread(target=func, args=(i, ))
  20. # t.start()
  21. """使用面向对象方式开启线程"""
  22. # class MyTread(Thread):
  23. # def __init__(self, arg):
  24. # super().__init__()
  25. # self.arg = arg
  26. #
  27. # def run(self):
  28. # time.sleep(1)
  29. # print(self.arg)
  30. #
  31. #
  32. # t = MyTread(10)
  33. # t.start()
  34.  
  35. # threading模块:
  36. # multiprocessing模块的完全模仿threading模块的接口,
  37. # 二者在使用层面上有很大的相似地方
  38. """修改全局变量"""
  39. # 在同一个进程多个线程之间的数据是共享的
  40.  
  41. # def func1(a):
  42. # global g
  43. # g = 0
  44. # print(g, a, os.getpid())
  45. #
  46. #
  47. # g = 100
  48. # t_list = []
  49. # for i in range(10):
  50. # t = Thread(target=func1, args=(i, ))
  51. # t.start()
  52. # t_list.append(t)
  53. # for t in t_list:
  54. # t.join()
  55. # print(g)
  56.  
  57. # 进程 是最小的内存分配单位
  58. # 线程 是操作系统调度的最小单位
  59. # 线程被cpu执行了
  60. # 进程内至少含有一个线程
  61. # 进程中可以开启多个线程
  62. # 开启一个线程所需要的时间要远远小于开启一个进程
  63. # 多个线程内部有自己的数据栈,数据不共享
  64. # 全局变量在多个线程之间是共享的
  65. # 在CPython解释器下的python程序 在同一时刻 多线程只能有一个线程cpu被执行
  66. # 高CPU(用多进程处理): 计算类 -----高CPU利用率 不占优势
  67. # 高IO(用多线程处理): 爬取网页 200个网页
  68. # qq聊天 send recv
  69. # 处理日志文件 读文件
  70. # 处理web请求
  71. # 读取数据库 写数据库
  72.  
  73. import time
  74. from threading import Thread
  75. from multiprocessing import Process
  76. """多线程与多进程时间对比"""
  77.  
  78. def func(n):
  79. n+1
  80.  
  81. if __name__ == '__main__':
  82. start = time.time()
  83. t_list = []
  84. for i in range(100):
  85. t = Thread(target=func, args=(i, ))
  86. t.start()
  87. t_list.append(t)
  88. for t in t_list:
  89. t.join()
  90. t1 = time.time() - start
  91.  
  92. start1 = time.time()
  93. p_list = []
  94. for i in range(100):
  95. p = Process(target=func, args=(i, ))
  96. p.start()
  97. p_list.append(t)
  98. for p in p_list:
  99. p.join()
  100. t2 = time.time() - start1
  101. print(t1, t2)

6.线程模块中其他方法

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 21:26
  4. # !@Author TrueNewBee
  5. import threading
  6. import time
  7.  
  8. def func(n):
  9. time.sleep(0.5)
  10. # 查看线程名字和id
  11. print(n, threading.current_thread(), threading.get_ident())
  12.  
  13. for i in range(10):
  14. threading.Thread(target=func, args=(i, )).start()
  15. print(threading.current_thread())
  16. print(threading.active_count()) # 查看所有线程数 11 加上主线程
  17. print(threading.enumerate())

7. 多线程写 socket sever

sever端

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 21:06
  4. # !@Author TrueNewBee
  5. import socket
  6. from threading import Thread
  7.  
  8. def chat(conn1):
  9. conn1.send(b'hello')
  10. msg = conn1.recv(1024).decode('utf-8')
  11. print(msg)
  12. inp = input(">>").encode('utf-8')
  13. conn1.send(inp)
  14. conn1.close()
  15.  
  16. if __name__ == '__main__':
  17. sk = socket.socket()
  18. sk.bind(('127.0.0.1', 8080))
  19. sk.listen()
  20. while True:
  21. conn, add = sk.accept()
  22. # 创建一个多线程实现多线程通讯
  23. Thread(target=chat, args=(conn, )).start()
  24. sk.close()

client端  (多线程中可以用input  而多进程中不可以用input)

  1. # !/usr/bin/env python
  2. # !--*--coding:utf-8 --*--
  3. # !@Time :2018/7/19 21:07
  4. # !@Author TrueNewBee
  5. import socket
  6.  
  7. sk = socket.socket()
  8. sk.connect(('127.0.0.1', 8080))
  9.  
  10. msg = sk.recv(1024)
  11. print(msg)
  12. inp = input('>>>>').encode('utf-8') # 多线程可以用input,多进程不可以用
  13. sk.send(inp)
  14. sk.close()

7.19python昨日复习和多线程(2)的更多相关文章

  1. 7.19python昨日复习和多线程

    关于GIL锁的经典面试题!!

  2. Java复习8.多线程

    Java复习8 多线程知识 20131007 前言: 在Java中本身就是支持多线程程序的,而不是像C++那样,对于多线程的程序,需要调用操作系统的API 接口去实现多线程的程序,而Java是支持多线 ...

  3. Python并发复习1 - 多线程

    一.基本概念 程序: 指令集,静态, 进程: 当程序运行时,会创建进程,是操作系统资源分配的基本单位 线程: 进程的基本执行单元,每个进程至少包含一个线程,是任务调度和执行的基本单位 > 进程和 ...

  4. Python并发复习2 - 多线程模块threading

    一.多线程的调用 threading 模块建立在thread 模块之上.thread模块以低级.原始的方式来处理和控制线程,而threading 模块通过对thread进行二次封装, 提供了更方便的a ...

  5. JAVA_SE复习(多线程)

    线程 1.两种创建线程的方式都有自身的优点.  实现 Runnable 接口的优点:  从面向对象的设计观点看,Thread 类严格来讲是一个虚拟CPU 的封装,因此只有要改变或扩展该CPU 模型 ...

  6. C# 基础复习 四 多线程

    单线程和多线程的区别     单线程:         只用主线程处理,如果一个操作在占用主线程,那么其他操作则无法执行     多线程:         除了主线程外,还开启了子线程来执行操作,子线 ...

  7. JavaSE复习_10 多线程复习

    △wait()和sleep()的区别:  1.wait():没有等待时间,而sleep()需要有等待时间作为参数.  2.在同步中对于CPU的执行权和锁的处理不同:   wait()会释放执行权和锁. ...

  8. 复习IOS多线程知识

    线程的注意点 1.不要同时开太多的线程(1~3条线程即可,不要超过5条) 2.线程概念 * 主线程 : UI线程,显示.刷新UI界面,处理UI控件的事件 * 子线程 : 后台线程,异步线程 3.不要把 ...

  9. Java复习 之多线程

    线程是一个程序中的不同路径 例子1 只有一条路径 每一个分支都是一个线程 实际上在一个时刻内 电脑只能运行一个进程 但是因为cpu运算速度很快 将时间分出来了 所以我们感觉是同时运行 创建线程的两种方 ...

随机推荐

  1. cordova开发ios炸鸡

    cordova/lib/copy-www-build-step.sh: Permission denied 解决办法: cd platforms/ios/cordova/lib sudo chmod ...

  2. Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动

    Linux Redis安装,Linux如何安装Redis,Linux Redis自动启动,Redis开机启动 >>>>>>>>>>>& ...

  3. ASPX代码加固小结

    1.replace替换 <%@Page Language="C#"%> <% string strID=Request["id"]; strI ...

  4. ConcurrentModificationException 详解

    工作中碰到个ConcurrentModificationException.代码如下: List list = ...;for(Iterator iter = list.iterator(); ite ...

  5. Oracle的闪回技术--闪回已删除的表

    注意闪回技术只能保护非系统表决空间中的表,而且表空间必须本地管理, 外键将不可以被恢复, 索引和约束的名字将会被命名为以BIN开头,由系统生成的名字 查看是否开启闪回: SQL> show pa ...

  6. The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make s

    我出现这个问题是引用资源文件问题 helper.getView(R.id.in_pic).setBackgroundResource(item.getResourceId()); //错的helper ...

  7. python --->字典 集合 学习笔记

    1.字典--->创建空字典:dict={} broa=["李宁",”耐克“,“阿迪达斯”,“鱼c工作室”] sloga=[“A”,“B”,“C”,“D”] dict={&qu ...

  8. js同步 异步 运行机制

    需要知道的那些事: 1.JS是单线程的(为什么?因为能提高效率.作为浏览器脚本语言,js的主要用途是与用户互动,操作DOM.而这也就决定它只能为单线程,否则会带来很复杂的同步问题),也就是说无法同时执 ...

  9. 状态保持以及AJAX的初步学习

    嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...

  10. 【LeetCode OJ】Longest Palindromic Substring

    题目链接:https://leetcode.com/problems/longest-palindromic-substring/ 题目:Given a string S, find the long ...