python 多进程与多线程对文件操作的一些总结

# coding:utf-8

"""

把大文件分块

big_file.txt 是一个500M的5位数的乱序文档

多线程并没有提升速度

"""

import time

txtfile = ''

import threading

def txtmap(txtup):

with open('big_file.txt','r') as f:

i = 0

while i < 100000:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtup += txt

# txtmap(txtfile)

start = time.time()

for i in range(100):

txti = threading.Thread(target = txtmap(txtfile))

txti.start()

        txti.join()

print(time.time() - start)

def txtmap2(txtup):

with open('big_file.txt','r') as f:

i = 0

while i < 1000000:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtup += txt

start = time.time()

for i in range(10):

txtmap2(txtfile)

print(time.time() - start)

多进程和队列初试

import time

from multiprocessing import Process

from multiprocessing import Queue

num = 0

qnum = Queue()

qnum.put(num)

def testnum(num):

num += 1

qnum.put(num)

for i in range(10):

p = Process(target = testnum,args = (qnum.get(),))

p.start()

        p.join()

# testnum(num)

print(qnum.get(),qnum.empty())

在这里,qnum属于实例化对象,不需要用global标记

多次测试,发现多进程加队列,必须把文件指针位置也放进去,不然下一个读取位置就会乱跳

with open('big_file.txt','r') as f:

q.put ((txtfile3,f.tell()))

def txtmap(qget):

txtup = qget[0]

i = 0

f.seek(qget[1])

while i < 10:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtup += txt

q.put((txtup,f.tell()))

start = time.time()

for i in range(10):

txtp2i = Process(target = txtmap,args =(q.get(),))

txtp2i.start()

                txtp2i.join()

print('多进程加队列',time.time() - start,'\n',q.get())

以及这个args的赋值真是烦人,明明从q.get()出来的就是元组,它非要你=后面必须是一个元组的形式才行

# coding:utf-8

"""

把大文件分块

big_file.txt 是一个500M的5位数的乱序文档

多进加队列速度 < 多进程全局变量(并不能达到程序设计的目的) < 多线程加队列 < 多线程加全局变量 < 普通全局变量

多进程因为进程间通讯必须借助队列Queue 或者管道pipe 并不能改变全局变量

"""

import os

import time

from multiprocessing import Process

from multiprocessing import Queue

import threading

txtfile = ''

txtfile2 = ''

txtfile3 = ''

txtfile4 = ''

q = Queue()

#我的本子是4核的,因为python的GIL的限制,所以同时只能运行4个进程,多了就会等待

with open('big_file.txt','r') as f:

def txtmap():

i = 0

global txtfile

while i < 25:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtfile += txt

print(txt)

                print (os.getpid ())

print(txtfile)

start = time.time()

for i in range(4):

txtpi = Process(target = txtmap)

txtpi.start()

txtpi.join()

print('多进程全局变量',time.time() - start,'\n',txtfile)

if txtfile:

print(True)

else:

print(False)

with open('big_file.txt','r') as f:

def txtmap():

i = 0

global txtfile2

while i < 10:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtfile2 += txt

start = time.time()

for i in range(10):

txtti = threading.Thread(target = txtmap)

txtti.start()

                txtti.join()

print('多线程全局变量',time.time() - start,'\n',txtfile2)

with open('big_file.txt','r') as f:

q.put ((txtfile3,f.tell()))

def txtmap(qget):

txtup = qget[0]

i = 0

f.seek(qget[1])

while i < 25:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtup += txt

                print (os.getpid ())

q.put((txtup,f.tell()))

start = time.time()

for i in range(4):

txtp2i = Process(target = txtmap,args =(q.get(),))

txtp2i.start()

                txtp2i.join()

print('多进程加队列',time.time() - start,'\n',q.get()[0])

#因为队列q内的消息已被取完,所以再放进去一次,不然会一直处于阻塞状态等待插入消息

q.put(txtfile3)

with open('big_file.txt','r') as f:

def txtmap(txtup):

i = 0

while i < 10:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtup += txt

q.put(txtup)

start = time.time()

for i in range(10):

txtt2i = threading.Thread(target = txtmap,args = (q.get(),))

txtt2i.start()

                txtt2i.join()

print('多线程加队列',time.time() - start,'\n',q.get())

with open('big_file.txt','r') as f:

def txtmap2():

i = 0

global txtfile4

while i < 10:

txt = f.read(1)

i += 1 if txt == ',' else 0

txtfile4+= txt

start = time.time()

for i in range(10):

txtmap2()

print('普通全局变量',time.time() - start,'\n',txtfile4)

#os.path.geisize返回的文件大小就是seek指针的最后一个位置

print(os.path.getsize('big_file.txt'))

with open('big_file.txt','r') as f:

print(f.seek(0,2))

#终于看到了多进程同时进行,哦呼!甚是欢喜!而且和文件的指针并不会冲突

from multiprocessing import Process

import time

with open('test.txt', 'r') as f:

def readseek(num):

f.seek(num)

print(time.time(),f.read(10))

time.sleep(10)

p1 = Process(target = readseek, args = (20,))

p2 = Process(target = readseek, args = (60,))

p3 = Process(target = readseek, args = (120,))

p4 = Process(target = readseek, args = (160,))

p1.start()

p2.start()

p3.start()

p4.start()

p1.join()

p2.join()

p3.join()

p4.join()

print(time.time())

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容