多进程
"""
Pool 可以提供指定数量的进程供用户调用,默认大小是 CPU 的核数。但有新的请求提交到
Pool 中时,池还没有满,就会创建一个新的进程用来执行该请求;如已达到最大数,就会等待
知道有进程结束,才会创建新的进程来处理他
"""
from multiprocessing import Pool
import os,time,random
def run_task(name):
print('Task %s (pid = %s) is running ...' % (name,os.getpid()))
time.sleep(random.random() * 3)
print('Task %s end.' % name)
if __name__ == '__main__':
print('Current process %s.' % os.getpid()) # os.getpid() 获得进程 id
p = Pool(processes=3)
for i in range(5):
p.apply_async(run_task,args=(i,)) #添加进程任务,i 为传进去的进程任务的参数
pass
print('Waiting for all subprocesses done...')
p.close() #不再添加新进程
p.join() #等待所有子进程执行完毕,调用之前必须先调用 close(),针对 Pool 对象
print('All subprocesses done.')
多进程+进度条
"""
Pool 可以提供指定数量的进程供用户调用,默认大小是 CPU 的核数。但有新的请求提交到
Pool 中时,池还没有满,就会创建一个新的进程用来执行该请求;如已达到最大数,就会等待
知道有进程结束,才会创建新的进程来处理他
"""
from multiprocessing import Pool
import os, time, random, tqdm
def run_task(name):
#print('Task %s (pid = %s) is running ...' % (name, os.getpid()))
time.sleep(random.random() * 3)
#print('Task %s end.' % name)
if __name__ == '__main__':
# 配置好进度条
pbar = tqdm.tqdm(total=5)
pbar.set_description(' Task Has Completed ')
update = lambda *args: pbar.update()
print('Current process %s.' % os.getpid()) # os.getpid() 获得进程 id
p = Pool()
for i in range(5):
p.apply_async(run_task, args=(5,), callback=update) # 通过callback来更新进度条
p.apply_async(run_task, args=(i,)) # 添加进程任务,i 为传进去的进程任务的参数
print('Waiting for all subprocesses done...')
p.close() # 不再添加新进程
p.join() # 等待所有子进程执行完毕,调用之前必须先调用 close(),针对 Pool 对象
print('All subprocesses done.')
多进程不执行
1.多进程执行的函数中如果用到了全局变量,变量不能定义在 if __name__ == '__main__' 下面
2.多进程代码必须在 f __name__ == '__main__' 下面
3.爬取数据会遇到一种情况,数据随时在更新,使用多进程服务器返回 500,不使用多进程就正常,可以选择截止到昨天的数据爬取,不包含今天的,问题就解决了。
多线程
"""
把一个函数传入并创建 Tread 实例
"""
import random
import time,threading
#新线程执行的代码
def thread_run(urls):
print('Current %s is running...' % threading.current_thread().name)
for url in urls:
print('%s --->>> %s' % (threading.current_thread().name,url))
time.sleep(random.random())
print('%s ended.' % threading.current_thread().name)
print('%s is runnung...' % threading.current_thread().name)
t1 = threading.Thread(target=thread_run,name='Thread_1',args=(['url_1',
'url_2','url_3'],))
t2 = threading.Thread(target=thread_run,name='Thread_2',args=(['url_4',
'url_5','url_6'],))
t1.start()
t2.start()
t1.join()
t2.join()
print('%s ended.' % threading.current_thread().name)