使用线程向同一会话发送多个 POST 请求

Sending multiple POST requests to the same session using threading

我目前正在制作一个脚本,它将在 shopify 平台

上的电子商务网站 运行 上添加到购物车和结帐项目

我正在尝试通过 运行在多个线程上添加到购物车方法来加快这个过程。我的添加到购物车功能如下所示:

def add_to_cart(keywords,size,session,quantity=1):
     ...

其中关键字是字符串列表,因此我们可以解析并找到正确的项目,会话是来自请求模块的新会话。该函数首先解析站点地图,找到唯一的产品 ID,然后向会话变量发送 post 请求以将所述商品添加到购物车。

但是,当我 运行 使用线程将多个项目添加到购物车的脚本时,我只看到购物车中的一个项目。为什么这不起作用?我是否需要锁定+解锁会话变量并逐个发送 POST 请求?

这是我 运行ning 的代码:

from ATC import *
from checkout import *
import requests
import time
import threading
from bs4 import BeautifulSoup

session = requests.Session()
init = time.time()

t1 = threading.Thread(target=add_to_cart, args=(['carabiner', 'black'], 'one size', session, 1,))
t2 = threading.Thread(target=add_to_cart, args=(['drury', '8.2'], '8.2', session, 1,))
t1.start()
t2.start()
t1.join()
t2.join()
now = time.time()
print("Time Taken: " + str(format(now-init, '.3g')) + 's')

根据我的经验,如果您同时点击 Shopify 更改多个购物车,则只有一个会通过。我的猜测是 Shopify 会像这样处理购物车:

在时间 0,我们有了初始购物车 - 称它为 cart0

在时间 t,我们同时向 add/update/change 购物车提交 n 个请求

请求 0:拿走 cart0 并应用请求,return 结果 请求 1:取 cart0 并应用请求,return 结果 ... Request n: take cart0 and apply request, return 结果

这似乎与我同时测试多个请求时得到的购物车 return 值一致 - 每个回调函数都会触发应用了单个更改的购物车。

我找到了两种解决此限制的方法。第一个是确保请求被链接起来,以便我们在进行下一个请求之前等待一个完成 - 有效地将异步请求转换为同步请求。不是速度的最佳选择。

另一种方法只有在我们不需要担心订单项属性时才有效:将所有 additions/changes 组合到对 /cart/update.js 的一次调用中,同时传递变体 ID 和所需数量一次 - 有关示例,请参阅 https://help.shopify.com/themes/development/getting-started/using-ajax-api#update-cart。如果您不需要担心线路属性,将您的单行添加更改为一次大更新将显着提高速度和可靠性。