多线程 VS 多进程?

2015-05-19 09:39:55 +08:00
 cc7756789
初学,多进程使用multiprocessing, 多线程使用threading。

我用一个爬虫测试多线程和多进程,线程为50个,执行完毕为10s;多进程开辟了50个子进程,执行完毕100s和用for循环差不多,而且奇卡无比。

不是说,多线程和多进程没有谁好谁坏之风,那我的思路错在哪里,难道是因为多进程不共享内存,故需要开启50个内存空间,所以奇卡无比,那么什么情况下该用多进程呢?
6659 次点击
所在节点    Python
24 条回复
9hills
2015-05-19 19:13:45 +08:00
Lz 这个锁加的。
9hills
2015-05-19 19:15:54 +08:00
@cc7756789 把锁去了就行了。追加写在普通情况下是原子的。更何况你的锁也包的太大了
wind3110991
2015-05-19 23:46:25 +08:00
@cc7756789 可以用下markdown语法。。强迫症看python难受 = 。 =

```python
import requests
from bs4 import BeautifulSoup
import multiprocessing

n = 0
url_list = ['http://ubuntuforums.org/forumdisplay.php?f=333', ]
for x in range(1, 50):
n += 1
raw_url = 'http://ubuntuforums.org/forumdisplay.php?f=333&page=%d' % n
url_list.append(raw_url)

def running(url, q, lock):
lock.acquire()
html = requests.get(url)
if html.status_code == 200:
html_text = html.text
soup = BeautifulSoup(html_text)

with open('/home/zhg/Pictures/cao.txt', 'a+') as f:
for link in soup.find_all('a', 'title'):
s = 'http://ubuntuforums.org/' + str(link.get('href')) + ' ' + str(link.get_text().encode('utf-8'))
f.writelines(s)
f.writelines('\n')
lock.release()

if __name__ == '__main__':
manager = multiprocessing.Manager()
p = multiprocessing.Pool(len(url_list))
q = manager.Queue()
lock = manager.Lock()
for x in url_list:
p.apply_async(running, args=(x, q, lock))
p.close()
p.join()
print "process ended"

```
slideclick
2015-05-20 10:33:00 +08:00
windows系统创建进程开销很大。另外IO密集型,多线程就够了。
什么时候用多进程?CPU密集的,这时需要利用多核,python只有进程才可以分布的多个核上面,线程做不到分布。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/192106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX