显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 
 
 
 

关于Python多线程 JOIN 方法【转】

2018-2-27 11:57:58 阅读44 评论0 272018/02 Feb27

Python多线程与多进程中join()方法的效果是相同的。

下面仅以多线程为例:

首先需要明确几个概念:

知识点一:

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下(其实就是setDaemon(False)),主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束,例子见下面一。

知识点二:

当我们使用setDaemon(True)方法,设置子线程为守护线程时,主线程一旦执行结束,则全部线程全部被终止执行,可能出现的情况就是,子线程的任务还没有完全执行结束,就被迫停止,例子见下面二。

知识点三:

此时join的作用就凸显出来了,join所完成的工作就是线程同步,即主线程任务结束之后,进入阻塞状态,一直等待其他的子线程执行结束之后,主线程在终止,例子见下面三。

知识点四:

join有一个timeout参数:

当设置守护线程时,含义是主线程对于子线程等待timeout的时间将会杀死该子线程,最后退出程序。所以说,如果有10个子线程,全部的等待时间就是每个timeout的累加和。简单的来说,就是给每个子线程一个timeout的时间,让他去执行,时间一到,不管任务有没有完成,直接杀死。没有设置守护线程时,主线程将会等待timeout的累加和这样的一段时间,时间一到,主线程结束,但是并没有杀死子线程,子线程依然可以继续执行,直到子线程全部结束,程序退出。

作者  | 2018-2-27 11:57:58 | 阅读(44) |评论(0) | 阅读全文>>

HTML5 网页保存为图片下载【转】

2018-1-24 10:13:19 阅读83 评论0 242018/01 Jan24

来源:https://juejin.im/post/5a17c5e26fb9a04527254689

1. 需求

最近丁香医生的产品大佬又双叒叕搞事情,想要在 H5 中做一个医生邀请提问的功能,可以将医生的二维码名片分享出去,支持移动、PC 和微信。之前的图片是由后端生成的,并且会缓存三天,导致信息更新不及时。由前端来做就能避免这些问题。

我一听,这好说,不就是个保存图片的功能么,简单看看需求:

完善卡片信息,分享出去时候信息更加立体 编辑个人资料入口 保存图片入口 可解决医生名片缓存时间问题 长下面这样 ?

分析下来就两点

html展示实时用户信息点击保存将当前页面保存成图片至本地,并且不包含功能按钮

2. 方案

因为之前已经听说过有个库能将 HTML 转为 canvas,然后又听说 canvas 能转为图片,然后又听说图片能下载....(开发基本靠听说(搜索),这是废话)

那我的基本方案就是:

html -> canvas -> image -> a[download]

html2canvas.js:可将 htmldom 转为 canvas 元素。传送门 canvasAPI:toDataUrl()

作者  | 2018-1-24 10:13:19 | 阅读(83) |评论(0) | 阅读全文>>

Sqlite3 大批量插入

2017-10-30 17:06:43 阅读71 评论0 302017/10 Oct30

如果你需要在数据库中一次性插入很多行,那么你真不应该使用 execute。sqlite3 模块提供了批量插入的方式:executemany。

而不是像这样做:

for row in iter_data():

    connection.execute('INSERT INTO my_table VALUES (?)', row)

你可以利用这个事实,即 executemany 接受元组的生成器作为参数:

connection.executemany(

    'INSERT INTO my_table VALUE (?)',

    iter_data()

)来源:https://www.oschina.net/translate/few-tips-sqlite-perf

作者  | 2017-10-30 17:06:43 | 阅读(71) |评论(0) | 阅读全文>>

Python 实现word 操作,并获取word中图片

2017-10-24 19:12:05 阅读110 评论0 242017/10 Oct24

word操作的模块很多:win32、python-docx、textract

#coding:utf-8

__author__='fc_lamp'

'''

Python word 操作

'''

from docx import Document

import os

import zipfile

from snownlp import SnowNLP

'''

python-docx 方式

(通过 pip install python-docx安装)

python-docx只支持docx格式的word

可接合使用snownlp 模块来实现中文分词处理

'''

wordf = '1.docx'

doc = Document(wordf)

#段落

wordn =0

for i in doc.paragraphs:

#一段一文字

print i.text

#print i.style.name

#关于word中图片的获取.......

#转压缩文件,word就是压缩文件

os.rename('1.docx','1.zip')

#释放出所有文件(包括图片)

f = zipfile.ZipFile('1.zip','r')

作者  | 2017-10-24 19:12:05 | 阅读(110) |评论(0) | 阅读全文>>

Python Logging 模块

2017-10-24 14:38:08 阅读58 评论0 242017/10 Oct24

我们可以使用Logging 很方便的实现日志记录,如下代码:

#coding:utf-8

import inspect

import os

import logging

logger = logging.getLogger('[TEST]')

#确定路径

this_file = inspect.getfile(inspect.currentframe())

dirpath = os.path.abspath(os.path.dirname(this_file))

handler = logging.FileHandler(os.path.join(dirpath,'log.log'))

#格式

formatter = logging.Formatter('%(asctime)s %(name)-12s %(levelname)-8s %(message)s')

#装载

handler.setFormatter(formatter)

logger.addHandler(handler)

logger.setLevel(logging.INFO)

#记录...

logger.info('test...')

logger.info('这是什么,这里错误....'.decode('utf-8'))

2017-10-24 14:31:04,730 [TEST] INFO test...

作者  | 2017-10-24 14:38:08 | 阅读(58) |评论(0) | 阅读全文>>

关于MODBUS协议

2017-7-8 20:23:33 阅读127 评论0 82017/07 July8

(注:MODBUS是应用层的通讯协议,主要用于传送和接收文件包的格式。而RS232,RS485是物理层的串行接口)。

一 官方说明

Modbus是一种单主站的主/从通信模式。Modbus网络上只能有一个主站存在,主站在 Modbus网络上没有地址,从站的地址范围为 0 - 247,其中 0 为广播地址,从站的实际地址范围为 1 - 247。 Modbus通信标准协议可以通过各种传输方式传播,如 RS232C、RS485、光纤、无线电等。

Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。

二 直白说明

modbus协议也只是通讯协议的一种,没什么神秘的,通讯协议包括两个方面:

一、通讯格式,即: 波特率,检验方式,数据位,停止位 (类似HTTP协议)

波特率:一秒钟传送的位数,也就是通讯速率;比如波特率为9600,即,一秒种可以传送9600个位数。

校验方式:奇校验或偶校验或无校验,目的是判断传输过程中是否有错误!它只是用于判断一个字符(比如八个位或是七个位组成一个字符)传输是否有错误。但是它并不能完全能够判断传输是否有错。比如偶校验,在检验送八个“11111111”时,如果到达接收方,由于干扰而变成了“10111101”,“1”的个数仍然是偶数,接收方就判断不出来传送的字符已经错误!

数据位:传输一个字符由几个位

作者  | 2017-7-8 20:23:33 | 阅读(127) |评论(0) | 阅读全文>>

在电商系统中,到底要怎么扣减库存?

2017-6-14 23:30:28 阅读175 评论0 142017/06 June14

来源:58沈剑

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:

调用层,一般是处于端上的browser或者APP

站点层,一般是拼装html或者json返回的web-server层

服务层,一般是提供RPC调用接口的service层

数据层,提供固化数据存储的db

对于库存业务,一般有个库存服务,提供库存的查询、扣减、设置等RPC接口:

库存查询,stock-service本质上执行的是

select num from stock where sid=$sid

库存扣减,stock-service本质上执行的是

update stock set num=num-$reduce where sid=$sid

库存设置,stock-service本质上执行的是

update stock set num=$num_new where sid=$sid

用户下单前,一般会对库存进行查询,有足够的存量才允许扣减:

如上图所示,通过查询接口,得到库存是5。

用户下单时,接着会对库存进行扣减:

如上图所示,购买3单位的商品,通过扣减接口,最终得到库存是2。

希望设计往往有容错机制,例如“重试”,如果通过扣减接口来修改库存,在重试时,可能会得到错误的数据,导致重复扣减:

如上图所示,如果数据库层面有重试容错机制,可能导致一次扣减执行两次,最终得到一个负数的错误库存。

作者  | 2017-6-14 23:30:28 | 阅读(175) |评论(0) | 阅读全文>>

MySQL常见SQL错误用法

2017-6-7 18:09:08 阅读110 评论0 72017/06 June7

来源:https://yq.aliyun.com/articles/72501

常见SQL错误用法1. LIMIT 语句

分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type, name, create_time字段上加组合索引。这样条件排序都能有效的利用到索引,性能迅速提升。

de >SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' ORDER BY create_time LIMIT 1000, 10; de>

好吧,可能90%以上的DBA解决该问题就到此为止。但当 LIMIT 子句变成 “LIMIT 1000000,10” 时,程序员仍然会抱怨:我只取10条记录为什么还是慢?

要知道数据库也并不知道第1000000条记录从什么地方开始,即使有索引也需要从头计算一次。出现这种性能问题,多数情形下是程序员偷懒了。在前端数据浏览翻页,或者大数据分批导出等场景下,是可以将上一页的最大值当成参数作为查询条件的。SQL重新设计如下:

de >SELECT * FROM operation WHERE type = 'SQLStats' AND name = 'SlowLog' AND create_time > '2017-03-16 14:00:00' ORDER BY create_time limit 10; de>

作者  | 2017-6-7 18:09:08 | 阅读(110) |评论(0) | 阅读全文>>

客户端(浏览器端)数据存储技术概览

2017-3-15 14:37:25 阅读177 评论0 152017/03 Mar15

在客户端(浏览器端)存储数据有诸多益处,最主要的一点是能快速访问(网页)数据。(以往)在客户端有五种数据存储方法,而目前就只有四种常用方法了(其中一种被废弃了):

CookiesLocal StorageSession StorageIndexedDBWebSQL (被废弃)[fc_lamp: 在基于WebKit 的浏览器是支持 sqllite操作]Cookies

Cookies 是一种在文档内存储字符串数据最典型的方式。一般而言,cookies 会由服务端发送给客户端,客户端存储下来,然后在随后让请求中再发回给服务端。这可以用于诸如管理用户会话,追踪用户信息等事情。

此外,客户端也用使用 cookies 存储数据。因而,cookies 常被用于存储一些通用的数据,如用户的首选项设置。

Cookies 的 基本CRUD 操作

通过下面的语法,我们可以创建,读取,更新和删除 cookies:

// Create

document.cookie = "user_name=Ire Aderinokun";

document.cookie = "user_age=25;max-age=31536000;secure";

// Read (All)

console.log( document.cookie );

// Update

document.cookie = "user_age=24;max-age=31536000;secure";

作者  | 2017-3-15 14:37:25 | 阅读(177) |评论(0) | 阅读全文>>

Linux 上传下载文件快捷方式

2017-2-23 16:46:58 阅读174 评论0 232017/02 Feb23

我们可以使用 rz 命令上传文件,sz 命令下载文件。

我们进入目标目录后,使用rz即可上传。

我们使用 sz /home/www/test.html 即可下载文件。

2017-04-19更新:

有时候我们装的linux系统中没有rz命令,我们只需要安装一下就行了

cd /mmz/tools

wget http://down1.chinaunix.net/distfiles/lrzsz-0.12.20.tar.gz

tar zxvf lrzsz-0.12.20.tar.gz

cd lrzsz-0.12.20

./configure --prefix=/usr/local/lrzsz

make

make install

cd /usr/bin 

ln -s /usr/local/lrzsz/bin/lrz rz #这里是加上命令链接

ln -s /usr/local/lrzsz/bin/lsz sz

rz

作者  | 2017-2-23 16:46:58 | 阅读(174) |评论(0) | 阅读全文>>

查看所有日志>>

 
 
 
 
 
 

有道博客搜索

 
 
 
 
 
 
 

四川省 成都市

 发消息  写留言

 
博客等级加载中...
今日访问加载中...
总访问量加载中...
最后登录加载中...
 
 
 
 
 

日志分类

 
 
日志分类列表加载中...
 
 
 
 
 
 
 
模块内容加载中...
 
 
 
 
 
 我要留言
 
 
 
留言列表加载中...
 
 
 
 
 
 
 
博友列表加载中...
 
 
 
 
 

小工具

 
 
模块内容加载中...
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018

注册 登录  
 加关注