python 这样写多线程对吗?怎么感觉不起作用。

from threading import Thread
import time


def filiterEmail():
    start = time.clock()
    i = 1
    linksRegex = re.compile('.*flower.*', re.IGNORECASE)
    with open("E:/abc.txt", 'rb') as fileSource:
        for line in fileSource:
            print(line)
            i = i+1
            if i == 5000000:
                break
    elapsed = (time.clock() - start)
    print("Time used:", elapsed)
    
t = Thread(target=filiterEmail)
t.start()

上面是我的代码,运算出来跟我单线程基本是一样的时间。
到底是要用多线程还是多进程。
如果是多进程要怎么写呢?
谢谢。

阅读 5.1k
4 个回答

你就一个线程在跑啊......

应该是分块读文件,比如分成三块,分别启三个线程处理1~10000,10001~20000,20001~30000行。

然后,pypy是有GIL的。

再然后,多线程和多进程在这个场景下都是可用的。

Python的Thread是“假的”
因为有个东西叫GIL

In CPython, the global interpreter lock, or GIL, is a mutex that prevents multiple native threads from executing Python bytecodes at once. This lock is necessary mainly because CPython’s memory management is not thread-safe. (However, since the GIL exists, other features have grown to depend on the guarantees that it enforces.)

具体情况看这篇文章
http://cenalulu.github.io/pyt...

总之Python的Thread只在IO Bound的情况下能提升性能
可以考虑用多进程替代
也可以换用其他解释器
Jython和IronPython都没有GIL
个人推荐pypy,没有GIL,还附送JIT(性能飞天),又能比较好地兼容一些常见的CPython上的库
或者也可以用其他语言写多线程代码

@龙方淞 说的对,python因为有GIL全局锁,所以python没有办法利用多个CPU,唯一办法就是通过多进程来替代多线程,
如果你的多线程大多数IO操作,那么你会感觉得是多个线程同时工作,如果你的多线程工作是CPU密集运算,那么你就会感觉python多线程实质上只是单线程工作。如果是这样你可以考虑多进程代替多线程

抛开gil的问题 你这个是单线程的 当然和没有用线程写法一样
但是如果你想要的是并发的话 不仅需要多进程 而且你也不能把open函数写在执行体里 各个并发部分会重复创建覆盖这个文件的...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题