Python多线程基础

同步和异步

同步

其实类似于小学时期如何在最短的时间内去完成所有事件的数学题。

假设小明早上7:00起床,刷牙洗脸需要3分钟,烧水需要10分钟,穿衣叠被需要2分钟,吃早餐需要15分钟,收听早间新闻需要20分钟(7点开始),问小明起床做完这些事情至少需要多长时间?

同步是指调用一旦开始,必须等待返回调用的结果,才能继续下一步操作

那么结果就是,小明一共需要听新闻(20分钟)+穿衣叠被(2分钟)+刷牙洗脸(3分钟)+烧水(10分钟)+吃早餐(15分钟),总共50分钟,一定要迟到了,很笨

异步

异步和同步相反,调用一旦开始,调用者无需等待方法的完成,就可以继续执行后续方法,被调用者通过状态体通知调用者,或者使用回调函数处理调用

异步方法下,小明需要打开新闻,开始烧水,穿衣叠被,再洗漱,吃早餐,只需要20分钟,新闻结束,就可以高高兴兴去上学了

并发和并行

并发

并发是同时具有多个活动的系统,实质是一个或多个物理CPU在若干道程序(或线程)之间多路复用,其实就是n个事件在同一时间线上交替完成:小明做完所有事件花了50分钟

并发

并行

并行是真正意义上的不同事件或线程在同一时刻同时执行。并行利用并发使系统运行更快,在操作系统的多个抽象层次运用,是n个事件在同一时刻上同时发生:小明家里雇了4个机器人保姆,1个打开电视后烧水,1个帮小明穿衣叠被,1个帮小明洗漱,最后1个喂小明吃早餐,这样在早间新闻放完前,小明只用了18分钟就完成了所有事件,还多出2分钟时间检查书包

并行

进程和线程

进程

程序不能自己运行,只有将程序装载进内存,由系统分配资源后才能运行。程序是指令的集合,可以视为指令的静态文本,而进程是指令的执行活动,是动态的行为

进程是操作系统对于一个运行中程序的抽象,是CPU、内存、IO设备的抽象。系统可以同时运行多个进程

线程

线程是操作系统进行运算调度的最小单位,被包含于进程中,是进程的实际运作单位。一个进程可以由多个线程组成,线程之间共享代码和数据。

由于在实际网络服务器中对并行的需求,线程成为重要的编程模型:

1.多线程之间比多进程之间更易共享数据。
2.线程一般比进程高效。

Read More

HTTP请求方法

GET

请求指定的页面信息,并返回实体主体

POST

向指定的资源提交数据,请求处理。数据被包含在请求体当中,重新提交页面,导致新资源的建立或已有资源的修改

PUT

从客户端向服务器传送数据来取代指定的文档内容

DELETE

请求服务器删除指定的页面

类似GET请求,返回的响应中没有具体内容,仅获取报头

OPTIONS

允许客户端查看服务器的内容

TRACE

显示服务器收到的请求,用于测试或诊断

CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器

GET方法和POST方法的区别

· GET仅请求目标信息,返回/刷新是无害的,POST每次返回/刷新会重新提交数据

· GET可被保存在书签、缓存、历史记录当中,POST不行

· GET相对没有POST安全

· GET参数通过URL进行传递,POST参数存放在Request body当中

· GET请求时,浏览器会将http header和data一起发送除去,服务器响应为200;

POST请求时,浏览器会先发送header,服务器响应100 continue,再发送data,服务器响应200(时间消耗相对GET要长)

· GET每次产生1个TCP数据包,POST产生两个

· GET对数据的长度有限制(2KB),POST没有限制

· GET仅允许ASCII字符,POST没有限制

Python的图片与字符画转换

总体思想为:将图片转换为灰度图片后,利用字符的“复杂程度”替换掉图片的内容,字符数组的“复杂程度”由大到小排列即可。

代码

(需要pip安装PIL库)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
from PIL import Image 
import argparse

# 命令行输入参数处理
parser = argparse.ArgumentParser()

parser.add_argument('file') # 输入文件
parser.add_argument('-o', '--output') # 输出文件
parser.add_argument('--width', type=int, default=80) # 输出字符画宽
parser.add_argument('--height', type=int, default=80) # 输出字符画高

# 获取参数
args = parser.parse_args()

IMG = args.file
WIDTH = args.width
HEIGHT = args.height
OUTPUT = args.output

ascii_char = list("$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\"^`'. ")


# 将256灰度映射到70个字符上
def get_char(r, b, g, alpha=256):
if alpha == 0:
return ' '
length = len(ascii_char)
gray = int(0.2126 * r + 0.7152 * g + 0.0722 * b)

unit = (256.0 + 1)/length
return ascii_char[int(gray/unit)]

if __name__ == '__main__':

im = Image.open(IMG)
im = im.resize((WIDTH, HEIGHT), Image.NEAREST)

txt = ""

for i in range(HEIGHT):
for j in range(WIDTH):
txt += get_char(*im.getpixel((j, i)))
txt += '\n'

print (txt)

# 字符画输出到文件
if OUTPUT:
with open(OUTPUT,'w') as f:
f.write(txt)
else:
with open("output.txt", 'w') as f:
f.write(txt)

(稿)

DOSBox0.74 For MASM

由于汇编的MASM是在32位环境下使用的,要在64位Windows环境下使用需要借助工具DOSBox。

DOSBox-0.74下载

地址:[https://pan.baidu.com/s/1wiAv0pwUhRavkM51pmdJCQ]
(提取码:m0kx)

MASM下载

MASM文件夹内至少要包含debug/exe2bin/link/masm四个.exe文件。
地址:[https://pan.baidu.com/s/1MC75x01gKBxZwxmBuYq6fA]
(提取码:4zu0)

使用

将DOSBox-0.74放进MASM文件夹内,找到DOSBox.exe文件双击打开,输入mount d d:\path,path可以为你的masm目录。
如果MASM文件夹下有编写好的.asm汇编指令,可以直接通过命令d:进入MASM,再输入masm,进入调试,输入.asm文件名称(可不写扩展名),依次link,debug完成。
效果如图:


Just for joy---打地鼠小游戏

Just For Joy 官网(模拟)

获取更多JFJ咨询,请关注我们的官方网站
Created by elbadaernU9.9(inc) powered by hexo 2018.

打地鼠小游戏

1
快来和你的小伙伴们来试试我们全新推出的休闲小游戏:MouseHit(打地鼠),游戏仅售0$!

购买链接:

1
2
链接: 
https://pan.baidu.com/s/1LSMij2q31pJXMwmXImponA
1
提取码:90t6

提要

我们的游戏基于Qt环境开发,可以实现调整游戏难度等各项基础功能,除此以外,我们为游戏设置了更多的可玩性因素!现在点击两个大红色问号,来获得作弊的快感!
你同样可以进行不同的游戏模式,我们目前开发出来经典模式和闯关两种模式,快来测试你在闯关模式中能闯到第几轮呢???
赶紧和你的小伙伴们一起来挑战吧!

(注,以上内容为演出效果,有时间将具体代码补至Github)

D3:SVG随机树与时钟等

基本功能及说明:

1.点击index.html文件,进入主页选择相应的功能。


2.选择svg盆栽随机树:基于D3和SVG生成的盆栽随机树,通过点击“Start Growing!”按钮,来实现盆栽的生长过程,同时更新按钮,继续点击“Growing More”继续生成更多的随机树子叶;最后通过点击“Replant”恢复花盆状态,可以进行重新生成;通过单机“Back”按钮,回到index主页面


3.选择SVG时钟:基于SVG和TweenmaxGSAP的时钟模型,用SVG来绘制时刻表形状,并通过GSAP来实现时钟指针转动的动态效果。进入主页以后会自动匹配系统时间,主要通过Tweenmax的GSAP动画形成环形时钟。浏览后可以通过点击“Back”按钮,回到系统index主界面,完成交互

用途

本文件内容可拆分用于装饰博客等视讯网站框架,增加功能性和可读性

使用的库和工具

jquery-2.1.1.min.js、TweenMax、D3.js、SVG

额外的Svg.css文件用于存放index.html的主界面信息,增强可视化。

其他




https://github.com/elbadaernU404/d3

Python爬虫相关

进程和线程

并发和并行

并发是同时具有多个活动的系统,实质是一个或多个物理CPU在若干道程序(或线程)之间多路复用。

并行是真正意义上的不同事件或线程在同一时刻同时执行。并行利用并发使系统运行更快,在操作系统的多个抽象层次运用。

进程

程序不能自己运行,只有将程序装载进内存,由系统分配资源后才能运行。程序是指令的集合,可以视为指令的静态文本,而进程是指令的执行活动,是动态的行为。
进程是操作系统对于一个运行中程序的抽象,是CPU、内存、IO设备的抽象。系统可以同时运行多个进程。

线程

线程是操作系统进行运算调度的最小单位,被包含于进程中,是进程的实际运作单位。一个进程可以由多个线程组成,线程之间共享代码和数据。
由于在实际网络服务器中对并行的需求,线程成为重要的编程模型:
1.多线程之间比多进程之间更易共享数据。
2.线程一般比进程高效。

Read More

Python正则表达式和requests爬虫

Some people,when confronted with a problem,think,”I know,I’ll use regular expressions.”Now they have two problems.

----Jamie Zawinski

正则表达式

正则表达式是可匹配文本片段的模式。最简单的正则表达式为普通字符串,与自己匹配。python模块re提供了其对正则表达式的支持。

requests模块

Requests是用Python语言编写,基于urllib,采用Apache2Licensed开源协议的HTTP库,是一个需要单独安装的第三方库。通过pip执行指令:

1
pip install requests


来安装requests模块。py3版本安装时自带pip。如果报错,可能需要对pip进行更新,执行:

1
python -m pip install -U pip


来对pip安装更新,需要注意的是这里需要将python添加进环境变量才可以执行。这样就完成requests模块的安装。

Read More

海龟绘图法(Python)

这里是python中的一个绘图模块:海龟绘图(turtle)。此模块可以让操作者绘制图形,而非打印文本。
其他命令参考:https://docs.python.org/3/library/turtle.html
绘图方法:参考搜索turtle graphis

最简单的示例:

import turtle
t=turtle.Pen()
t.reset()
for x in range(100):
t.forward(x)
t.left(90)
效果图:

这里需要注意的是,存储文件时文件名称不能以turtle命名,否则解释器将会报错。

之后可以尝试结合随机函数和随机语句来绘制较为复杂的图形:

import turtle as t
from random import randint
t.TurtleScreen._RUNNING = True #使程序于IDLE中顺利运行
t.speed(0) #速度最快
t.bgcolor(“black”) #背景色为黑色
t.setpos(-25, 25) #起始位置
t.colormode(255) #颜色模式为真彩色
i = 0 #赋哑值
for a in range(0,200): #绘制花瓣
r = randint(0, 255)
g = randint(0, 255)
b = randint(0, 255)
t.pencolor(r, g, b)
t.forward(50 + i)
t.right(85)
t.forward(i)
t.left(30)
i += 1
t.left(90) #绘制花杆
t.pensize(width=10)
t.pencolor(“green”)
t.speed(10)
t.forward(250)
t.done()
效果图:

可以进一步来设计一个小游戏:

import turtle as t
from random import randint

t.TurtleScreen._RUNNING = True
t.setup(width=750, height=350, startx=None, starty=None) #界面大小设置
t.hideturtle() #隐藏海龟画笔
t.color(“orange”)
t.penup()
t.setpos(0, 0)
myfont = (“隶书”, 16, “normal”) #设置字体
target = randint(1, 100)
t.write(“一个1到100之间的整数,猜猜看:”, font=myfont)
guess = 0
while target!=guess in range(0,100):
guess = t.simpledialog.askinteger(“猜数游戏”, “请输入一个整数:”)
if guess == target:
answer = “Congratulations!”
t.bgcolor(“black”)
elif not guess:
t.clear()
t.write(“Give Up,Game Over.”, font=myfont)
break
elif guess > target:
answer = “你猜大了,再猜一次:”
else:
answer = “你猜小了,再猜一次:”
t.clear()
t.write(answer, font=myfont)
t.done()
初始界面:

胜利界面:

放弃界面:


Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2024 青域 All Rights Reserved.

UV : | PV :