python 多进程共享变量

原创 2015年11月19日 11:31:05

现在要读取多个数据文件从中抽取数据将结果合并(相当于word count)


方法一是常规的分多线程分别处理数据输出,最后定义一个字典遍历输出文件将结果集合并

方法二是先定义结果集字典,然后多线程处理数据,放入字典的时候加上同步锁


以为方法二会比方法一快的多 因为省去了大量的IO,只在合并结果的时候加锁

然而测试之后发现同步锁反而是最大的瓶颈


测试20W数据,抽取某个字段开16线程跑,方法一用了10s,方法二用了55s

这差距也太大了……天


所以还是老老实实放弃多线程同步共享变量把 性能太差


python 多线程 加锁同步 共享变量的代码如下

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import MySQLdb
import re
import multiprocessing
import os
import traceback

import jieba
import ConfigParser
import datetime
import json
import logging

def myprocess(num,indir,titles,lock):
		
	try:
		fin = open(indir + os.sep + str(num),'r')
		cnt0 = 0
		for line in fin:
			cnt0 += 1
			if cnt0 %100 == 0:
				print num,cnt0
			if cnt0 == 10000:
				break
			data = eval(line.strip())
			us_id = int(data[21])
			title = data[8]
			if title.strip() == '':
				continue
			with lock:
				if title in titles:
					titles[title].append(us_id) 
				else:
					titles[title]=[us_id]
		print num,'END'
				
	except Exception,e:
		traceback.print_exc()

def func():
	indir = '/root/data/bids/data_all'
	outdir = './titles1119'
	#if not os.path.exists(outdir):
	#	os.mkdir(outdir)
	start,end,add = 0,20,1
	manager = multiprocessing.Manager()
	lock = manager.Lock()
	titles = manager.dict()
	#开启进程池
	pool = multiprocessing.Pool(processes = 16)	
	for num in range(start,end,add):
		pool.apply_async(myprocess,[num,indir,titles,lock])
	pool.close()
	pool.join()
	titles = dict(titles)
	with open(outdir,'w') as fout:
		for title in titles:
			print >> fout,'%s\t%s'%(title,titles[title])
			if len(titles[title])>1:
				print titles[title]

if __name__ == '__main__':
	program = os.path.basename(sys.argv[0])
	logger = logging.getLogger(program)
	logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',filename = program+'.log',filemode='a')
	logging.root.setLevel(level=logging.INFO)
	logger.info("start running %s" % ' '.join(sys.argv))
	func()
	logger.info("end\t running %s" % ' '.join(sys.argv))




multiprocessing在python中的高级应用-共享数据与同步

通常,进程之间彼此是完全孤立的,唯一的通信方式是队列或管道。但可以使用两个对象来表示共享数据。其实,这些对象使用了共享内存(通过mmap模块)使访问多个进程成为可能。Value( typecode, ...
  • Winterto1990
  • Winterto1990
  • 2015年08月30日 17:13
  • 3590

Python 多进程默认不能共享全局变量

主进程与子进程是并发执行的,进程之间默认是不能共享全局变量的(子进程不能改变主进程中全局变量的值)。如果要共享全局变量需要用(multiprocessing.Value("d",10.0),数值)(m...
  • houyanhua1
  • houyanhua1
  • 2017年10月14日 20:13
  • 921

Python 学习笔记 多进程 multiprocessing

Python 解释器有一个全局解释器锁(PIL),导致每个 Python 进程中最多同时运行一个线程,因此 Python 多线程程序并不能改善程序性能,不能发挥多核系统的优势,可以通过这篇文章了解。 ...
  • u010229420
  • u010229420
  • 2016年11月25日 19:44
  • 9818

Python多线程下的全局变量、局部变量

Python多线程下的全局变量、局部变量 最近开发一个新功能遇到一个问题,就是在一个A.py文件生成2个线程,调用B.py里的函数,B.py里面有若干global定义全局变量,导致程序得不到想要的结果...
  • liuweiweiwei
  • liuweiweiwei
  • 2016年05月30日 10:34
  • 6507

Python 进程之间共享数据(全局变量)

进程之间共享数据(数值型): import multiprocessing def func(num): num.value=10.78 #子进程改变数值的值,主进程跟着改变 i...
  • houyanhua1
  • houyanhua1
  • 2017年10月15日 21:25
  • 660

Python中多进程之间的数据共享

Python中多进程之间的数据共享 发表于 2016-07-24 | 分类于 Python | 0 | 阅读次数 387 多进程中,每个进程都是独立的,各自持有一份数...
  • Luckyzhou_
  • Luckyzhou_
  • 2017年04月15日 18:15
  • 4056

python中的多线程-共享全局变量

在一个进程内的所有线程共享全局变量,能够在不适用其他方式的前提下完成多线程之间的数据共享(这点要比多进程要好) 缺点就是,线程是对全局变量随意遂改可能造成多线程之间对全局变量的混乱(即线程非安全) ...
  • xun527
  • xun527
  • 2017年08月10日 22:59
  • 779

Python多进程数据共享之Array

# coding=utf-8 from multiprocessing import Process from multiprocessing import Array def agk(...
  • douyunqian668
  • douyunqian668
  • 2017年03月28日 21:55
  • 644

Python中多进程之间的数据共享

Python中多进程之间的数据共享 发表于 2016-07-24 | 分类于 Python | 0 | 阅读次数 387 多进程中,每个进程都是独立的,各自持有一份数...
  • Luckyzhou_
  • Luckyzhou_
  • 2017年04月15日 18:15
  • 4056

Python多线程下的全局变量、局部变量

Python多线程下的全局变量、局部变量 最近开发一个新功能遇到一个问题,就是在一个A.py文件生成2个线程,调用B.py里的函数,B.py里面有若干global定义全局变量,导致程序得不到想要的结果...
  • liuweiweiwei
  • liuweiweiwei
  • 2016年05月30日 10:34
  • 6507
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python 多进程共享变量
举报原因:
原因补充:

(最多只允许输入30个字)