今天本来是想写个爬虫,结果发现对python非常生疏,于是自学了点东西,解决了点小麻烦,在此总结下:
1. if __name== '__main__': main() 的含义:
比如写了一个PY文件,但是在其他文件中也想引用,这时就可以在文件中设置这一行,代表如果执行这个文件则运行main(),如果在其他文件中引用这个文件则不执行
2.下面是一些多线程,多进程并发的总结。虽然这是第一次用python写并行,但是之前学过操作系统和linux下C语言的并发编程,所以对它还是有一些了解的,鉴于LZ使用的是MAC OS X,所以程序在WINDOWS下不知道能不能运行。
需要引入的有:
import os
import time,threading
from multiprocessing import Pool,Process
A: fork()创建多进程:
import os
pid = os.fork()
if pid==0:
print 'child'
else:
print 'parent'
子进程中fork()返回的pid的值为0,如果想获取自己的pid,使用os.getpid(), 如果想获取父进程的pid,使用os.getppid(),父进程中返回的pid为子进程的PID而非自己的。
B:multiprocessing模块:
def test(a):
global mm
print 'qqq%s'%a
time.sleep(10)
mm = mm+1
print mm
print 'ok%s'%a
mm = 0
p = [0,1,2,3,4,5,6,7,8,9]
for i in range(10):
time.sleep(1)
p[i] = Process(target=test,args=(i,))
p[i].start()
print 'get'
for j in range(10):
p[j].join()
pass
#p[0].join()
print os.getpid()
使用Process创建进程后自动执行target的函数,p.join()表示父进程只有在p这个进程执行完后才继续,如果要等所有进程执行完,则要对所有子进程使用join()
C:进程池:
def test(a):
print a
p = Pool()
for i in range(2):
p.apply_async(test,(i,))
p.close()
print 'xxx'
p.join()
使用Pool()创建进程池,apply创建子进程。close表示当子进程全部运行完成后关闭进程池,join表示进程池关闭后下面的代码才会执行。
注意:close之后的print代码不会等到关闭后才执行,只有执行到join时主进程才阻滞。
D:多线程:多线程和多进程B方法相似只是把Process改成threading.Thread即可
3. 文件IO
A:读文件read(),readline(),readlines()
使用with open('a.txt', 'r') as f : 打开文件且能自动关闭,使用f.read(size)读取全部或固定大小的文件,使用readlines()读取全部行并且按行存入list中,对于大文件使用
with open('a.txt', 'r') as f :
#print f.readlines()
print '\n'
'''
for line in f.readlines():
print line.strip()
'''
line = f.readline()
while line:
print line.strip()
line = f.readline()