python – OS相关

本子文件简介

您下载后脚本文件夹名为:人民的名义

其间的relationship.py正是大邓写的库(直接能调用的啊)

达成效益:

① 、读入小数数据和剧中人物词典后,对数据分词后转移剧中人物关周全据(有向关全面据)

② 、无需gephi绘图即可制作绚丽剧中人物关系互连网图。

注意:

壹 、运营脚本前,文件夹中只保留剧中人物名单.txt 人民的名义.txt 和
relationship.py

② 、要想图片美观点,一定要联网啊。里面笔者写了个爬虫,爬取八个配色网站的配色值。

万一你们想单机也足以画出雅观的图,可以修改下代码,将代码爬虫部分改成读取本地颜色数据

前言

自个儿是偏后台开发的coder,学到python的那里时进一步的关切。操作系统的相干接口在python是否比linux
C中要精简的多。OS的定义不说了,此次笔记集中关切python中多进度、多线程、高并发、加锁同步、进度间通信等达成。

近来繁忙学术,公众号更新的有点慢了,在此地给我们个歉,希望大家能继承帮忙我。由于学术需求,未来一段时间,作者之后会有一些文书分析的台本要出新,希望大家喜爱。

Definition

进程(process),在自家的知情中,正是贰个职务,是一段运转的顺序。后台的童鞋应该清楚其本质便是一个task_struct结构体,里面记载着程序运营要求的具有能源和他本人的音讯。当她收获运营所需的内部存储器、CPU财富等,也正是成为了2个running状态的经过。

能够把经过驾驭为1个任务,那线程正是成功那一个职分的执行流。线程是CPU调度的细小粒度。经常来说,今后的门类中,至少自个儿接触的,一个进度中都包含着时时刻刻二个的线程。究竟今后的OS都以SMP的,丰裕利用多为重压实程序效用应该是各类coder敲键盘时须要事先考虑的。

前几天给大家带来本人写好的脚本,用来分析社会互连网关系。

多线程

有人会有疑问,问哪些要在经过中开几个线程,多创建几个进程一起工作不就行了。其实这么是足以的,只但是经过这么些单位有点大,相比占用能源,创立的时候开支比较大(尤其在windows系统下),进度多了CPU调度起来,在经过间切换也是那多少个耗费时间的。还有多职责协同合营时,要求数据调换,进度间通讯也是付出,而1个历程中的线程是共享进程的内部存款和储蓄器空间的,能够间接互动。所以现在多线程的顺序更为宽广。

可是多线程也是有弊端的,协同合作的多线程,有贰个挂了,会潜移默化到全数的其它线程,也就表示那个任务是做不下来了。进程因为具备独立的地方空间,所以多个经过死了对任何进度的震慑能够说相当小。

python中提供了threading模块为二十四线程服务,threading.current_thread()归来当前线程,主线程名为MainThread

import threading

thread = threading.Thread(target=func,args=())
thread.start()
thread.join()

四线程编制程序,最要害的固然一道和排斥,也正是各样锁的用法。为啥要用锁,后台的童鞋应该都懂,未来的SMP操作系统都以抢占式内核,也正是不怕你区别的核共同工作时,很幸运的远非改乱三个共享变量,当然那就不容许了。当你的CPU时间片到时刻了,恐怕必要内部存款和储蓄器照旧IO财富,你被踢出了CPU的干活行列,你不能够不得在走的时候给你的能源把锁加上,下次再来接着做。线程同步的最首要的是对共享能源的论断,和接纳适当的锁。也便是对怎么样财富加锁和用如何锁。

可是在python中很遗憾,二十四线程存在着天生的弱点,因为拥有GIL的留存,那是python解释器的宏图缺陷。导致python程序在被分解时,只可以有几个线程。可是,对于IO密集型的顺序,八线程的筹划如故很有帮带的。比如爬虫

  • 最常用的锁,类似 mutex
  • 规则变量,threading.Condition()会包罗二个Lock对象,因为那二者一般都以匹配使用的。
  • 信号量,threading.Semaphore()

import threading

lock = threading.Lock()
lock.acquire()
lock.realease()  #配合try...finally保证最后释放掉锁,防止死锁

cond = threading.Condition()
cond.wait()
cond.notify()   cond.notify_all()

sem = threading.Semaphore(NUM)
sem.acquire()
sem.realease()

event = threading.Event()   #相当于没有lock的cond
event.set(True)
event.clear()

假定以下的意况

thread_func(params):
    web_res = params
    def func1(web_res):
        http = web_res.http
        TODO
    def func2(web_res):
        data = web_res.data
        TODO
    def func3(web_res):
        user = web_res.user
        TODO

在1个线程中,又存在八个子线程或许函数时,须要把四个参数都传给它们时。能够透过唯一的id来分别出从全局变量自个儿的一些变量时。可以用ThreadLocal实现

import threading 

student = threading.local()

def func(name):
    person = student.name  #需要之前关联过

p1 = threading.Thread(target=func,argc='A')
p1 = threading.Thread(target=func,argc='B')

通过ThredLocal免去了咱们切身去字典中存取。日常用于web开发中的为各种线程绑定几个数据库连接,HTTP请求,用户身份音信等。

利用示例

一 、建好小说数据中的剧中人物字典,格式如下

② 、在文书夹中放入随笔txt文件(人民的名义.txt)

三 、在剧本文件夹中新建1个test.py文件

4、运行

文本夹中生成了 人物关系图.png、node_edge.txt和node_freq.txt文件。

node_edge.txt 有向图关全面据,能够持续导入gephi软件自定义制图

node_freq.txt 节点出现频率

注意:历次运转前请把人选关系图.png、node_edge.txt和node_freq.txt文件删除掉,再运营

分布式进度

分布式是为着在横向上升高整种类统的负载能力。python中multiprocessing模块中的manage子模块援救把多进程分布到差别的机器上。当然肯定期存款在2个master进程来顶住职责的调度。依赖manage子模块,能够很轻松的写出分布式程序。

比如说爬虫,想要爬下豆瓣也许微博那样网站的一体数量,用单机估摸得开销好几年。能够把要求爬的网站的保有U奥迪Q3L放在叁个Queue中,master进度负责Queue的军管,能够将广大装置与master进度所在的装置建立联系,爬虫起先得到URL时,都从主机器获取。那样就能担保协同不争辨的合营。

文中末尾附有脚本文件下载地址

=

=

经过间通讯

multiprocessingQueue或者Pipe来帮衬完结,类似linux中的Pipe,打开一条管道,一个进程往里面扔数据,1个从另三头捡数据。python中的Pipe是全双工管道,既能够读也能够写。能够透过Pipe(duplex=False)创制半双工管道。

from multiprocessing import Pipe,Queue
#实例
q = Queue()
p = Pipe()
#写入数据
q.put(value)
p[0].send(value)
#读数据
q.get()
p[1].recv()

分别举个例证,用Queue

from multiprocessing import Process, Queue
import os, time, random

def write(q):
    print('Process to write: %s' % os.getpid())
    for value in ['A','B', 'C']:
        print('Put %s to queue...' % value)
        q.put(value)
        time.sleep(random.random())

def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.get(True)
        time.sleep(random.random())
        print('Get %s from queue.' % value)

if __name__=='__main__':
    q = Queue()
    pw = Process(target=write, args=(q,))
    pr = Process(target=read, args=(q,))

    pw.start()
    pr.start()
    pw.join()
    pr.terminate()

用Pipe:

from multiprocessing import Process, Pipe
import os, time, random

def write(q):
    print('Process to write: %s' % os.getpid())
    for value in ['A','B', 'C']:
        print('Put %s to pipe...' % value)
        q.send(value)
        time.sleep(random.random())

def read(q):
    print('Process to read: %s' % os.getpid())
    while True:
        value = q.recv()
        time.sleep(random.random())
        print('Get %s from pipe.' % value)

if __name__=='__main__':
    p = Pipe()
    pw = Process(target=write, args=(p[0],))
    pr = Process(target=read, args=(p[1],))

    pw.start()
    pr.start()
    pw.join()
    time.sleep(2)
    pr.terminate()

以此图笔者一向不用到gephi或许其余的工具,是作者用python纯脚本运维出来的。简单的完结了包装,大家有趣味能够下载下脚本,运转下。

多进程

linux的基石向外提供了 fork()
这几个系统调用来创设3个本进程的正片,当然往往fork()后都接着 exec()
族系统调用,我们成立二个历程一般都是为了执行其余的代码程序。

python的 os
模块封装了好多常用的种类调用,可以说是python中最常用的3个库了。举个栗子:

import os

print('Process (%s) start...' % os.getpid())

pid = os.fork()
if pid == 0:
    print('Child process (%s).' % os.getpid())
else:
    print('Parent process (%s).' %  pid)

fork() 会返回七个结实,父进程重回一个大于0的无符号数,子进度重回0。

大家都精通socket()是有好多少个步骤的,而对于web服务器,每一日每时每分都有着累累的造访请求。要是是3个进度向外提供劳务,那就是这么些进度为第2个用户从创建socket到关闭,再为下二个用户提供服务。用户时排着队接受劳务的,显著不相符逻辑。

拿Apache举个栗子,它是多进程架构服务器的意味。

  1. 运营主程序,只担负server端socket的listen()
    accept(),当然主进度是三个护理进度
  2. 每当2个用户请求服务,就会调用fork(),在子程序中接受多少,read()或者write(),然后提供劳务直到关闭
  3. 主进度依然要担当回收实现的子进度能源的

伪代码如下:

import os

server_fd = socket()
bind(server_fd,ip,port)
listen(server_fd,MAX_PROCESS)
While Online:
    connfd = accpet(server_fd)
    for each connfd:
        os.fork()
        // TODO
close(server_fd)

上面那段程序只适用linux平台,windows平台创建进度的方法并不是 fork()
调用。python中提供了multiprocesssing模块来合作windows,比起fork(),代码的语义更好通晓一些

from multiprocessing import Process
import os

def run_proc(name):
    print('Child process %s (%s)...' % (name, os.getpid()))

if __name__=='__main__':
    print('Parent process %s.' % os.getpid())
    #创建Process实例
    p = Process(target=run_proc, args=('test',))
    print('Child process will start.')
    p.start()
    p.join()
    print('Child process end.')

这里的join语义和linux平台的八线程中的join语义很像,但效益实在是linux平台的wait

有时需求进度池,multiprocessing 也间接提供了pool用于创建。

pool.apply(func,params) 是单进程阻塞模式
pool.apply_async(func,params,callback)  是多进程异步模式
pool.map(func,iter) 用于可迭代结构,阻塞式调用
pool.map_async(func,iter,callback)

一般景色下,依旧把进度数控制成和CPU核数相同。pool停止调用pool.join()回收进程财富时,必要先pool.close()

下面提到过,创设1个新进程的原故反复是为了加载新的代码,去实施新的天职。所以python封装了fork()和将来的exec族,提供subprocess模块,直接操作新的子进程。那个包,一般是用来进行外部的吩咐或许程序如shell命令,和os.system()类似。

import subprocess

r = subprocess.call(['ls','-l'])    #阻塞
r = subprocess.call('ls -l',shell = True)
r = subprocess.check_call(['ls','-l'])  #returncode不为0则raise CalledProcessError异常
r = subprocess.check_output('ls -l',shell=True)
r = subprocess.Popen(['ls','-l'])   #非阻塞,需主动wait

r = subprocess.Popen(['ls','-l'],stdin=child1.stdout,stdout=subprocess.PIPE, stderr=subprocess.PIPE)    #设置标准输入输出出错的句柄
out,err = r.communicate()   #继续输入,或者用来获得返回的元组(stdoutdata,stderrdata)

手动继续输入的例证:

import subprocess

print('$ python')
p = subprocess.Popen(['python'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
output, err = p.communicate(b"print('Hello,world')")
print(output.decode('utf-8'))
print('Exit code:', p.returncode)

越多内容

文本分析

python居然有心绪??真的吗??

自然语言处理库之snowNLP

责怪中南京大学学硕士感情况况及选择配偶观

用gensim库做文本相似性分析

依据共现发现人物关系的python达成

用python计算两文书档案相似度

爬虫

初识Python的GUI编程

爬虫实战录像专辑

【摄像】手把手教你抓实看的女孩子~

当爬虫遭受验证码,如何是好

知易行难

用词云图解读“于欢案”

【录制】于欢案之网上好友的见识(1)?

【摄像】有了selenium,小白也能够自豪的说:“去TMD的抓包、cookie”

【摄像】快来get新技巧–抓包+cookie,爬腾讯网不再是梦

【录像教程】用python批量抓取简书用户音信

爬豆瓣电影名的小案例(附摄像操作)

爬豆瓣电影名的小案例2(附摄像操作)

用Python抓取百度地图里的店名,地址和联系方式

神奇的python

怜香惜玉,笔者用python帮办秘书

逆天的量化交易分析库-tushare

酷炫的matplotlib

开扒皮本身微信的潜在

8行代码完结微信聊天机器人

利用Python登录QQ邮箱发送QQ邮件

当前差不离的文本分析已经满足自小编人物要求,所以还不会去学机器学习,职分导向是最好的读书格局。希望大家也能找点有意思义务,python下。

关爱群众号:大邓带您玩python

规律知识

自个儿就简单说下原理吧,先刻画3个不难易行的图A

双节点,有方向A–>B

丰盛更加多节点

好了,同样的道理,大家建立剧中人物词典,插入节点列表,然后遍历插入有向边境海关系,就能做出那图

端详大家能够去探访试行楼网

《Python基于共现提取《蔚山行》人物关系》

这篇小说写的很好(希望不要黑自身,作者也是认为真心好)。小编基本上借鉴了那篇作品思路写前几日以此剧本,完成了自动生成关系网络图。

预备干活

一、安装matplotlib、networkx

② 、化解matplotlib不能写汉语难点

1、找到pythonX\lib\site-packages\matplotlib\mpl-data\fonts\ttf文件夹

二 、matplotlib暗中认可调用的为DejaVuSans.ttf字体文件,网上下载个微软雅黑.ttf

三 、将微软雅黑文件名改为DejaVuSans.ttf粘贴到ttf文件夹下即可。

发表评论

电子邮件地址不会被公开。 必填项已用*标注